UDJ-Desktop-Client-0.6.4/0000755000175000017500000000000012051252546014414 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/windows_steps0000664000175000017500000000244712051252546017260 0ustar kurtiskurtis1. Add the following repos sudo zypper addrepo http://download.opensuse.org/repositories/windows:/mingw/openSUSE_11.4/windows:mingw.repo sudo zypper addrepo http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_11.4/windows:mingw:win32.repo sudo zypper addrepo http://download.tomahawk-player.org/packman/mingw:32/openSUSE_11.4/mingw:32.repo 2. Refresh opensuse and make sure it's up to date sudo zypper refresh sudo zypper dist-upgrade 3. Install package sudo zypper install ccache sudo zypper install mingw32-libopenssl-devel sudo zypper install mingw32-phonon sudo zypper install wget 4. Get all the packages needed for compiling sudo zypper source-install --build-deps-only mingw32-tomahawk-unstable 5. Get the packages needed for builing the installer sudo zypper source-install --build-deps-only mingw32-tomahawk-player-installer 6. Also install the packages here: Go to this URL: http://download.tomahawk-player.org/packman/mingw:32/openSUSE_12.1/x86_64/ Download the 2 packages on them install them: sudo zypper install 7. Create a build directory mkdir build/ cd build/ 8. Configure using: cmake -DCMAKE_TOOLCHAIN_FILE=admin_win_Toolchain-mingw32-openSUSE.cmake .. 9. Install the special vlc cd ../admin/win/ ./update-vlc.sh 10. Make Package cd ../../build/ make packageUDJ-Desktop-Client-0.6.4/admin/0000775000175000017500000000000012051252546015506 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/admin/win/0000775000175000017500000000000012051252546016303 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/admin/win/nsi/0000775000175000017500000000000012051252546017074 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/admin/win/nsi/page_header.jpg0000664000175000017500000005255612051252546022037 0ustar kurtiskurtisJFIF*ICC_PROFILE lcmsmntrRGB XYZ )9acspAPPL-lcms desc^cprt\ wtpthbkpt|rXYZgXYZbXYZrTRC@gTRC@bTRC@descc2textFBXYZ -XYZ 3XYZ o8XYZ bXYZ $curvck ?Q4!)2;FQw]kpz|i}0C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222;S" G_$)aRDH$A1 ZWbfMZ^4)D_0UkEď>TE+Q[Tܲ3{h^}bHHLR{lHbkpĀҫNbmA]z@12R_-)Aӝ~ͺNvj;nf=n=g6mn[l&؛2;Hֵ淽.Vn6MN923:e C{LxVQF}Ǚ*M/Qj&@ƙ)' PS  u" LП^o"b`RZ&&Ae1w:qtms:^1jm^o_zf=};f4%J{[~y[q/j֙PilxҲ"LHx)*xs&Kͷ{K7cKXŸ^kmE{gQL&*i V 5){ ڼu`<ۤiZtKb6Sk/ })̺1z>W6Bс Л龴!!΂7+khʀx-XNQiVnU)*)իQ^D LHөk[9}y&PLL |:'t#+Niw@ڛFתm|Cޡ]11.a~S0}%m7?~ [٩]a)O/E![.. JajyNPZZDB貹D g10HMYH Ac}i.t:#<\eiMShmr6ˢ__&&ךZF"ݲ^}s\66ф -GFlȮ0 y9e?~75@#(crx\No"U-V V6 -ZoWVz/lJ.` $s/_;k&)U/?Br^>r pע`5*2&χ9iǾmWIi5&6}6׀vM+zBy ^7szh@LL[h]Lb흨rq8ڦ[&br/&FQfrFW;и1և3c[Y=+Hr廢n&\-Ҹ[pg);J[ua3uG%W1M@"rv&:j>,Nmͣ<4ږ-A2zM\vGY @uiZ&3*ҩ15&$D $b@lm+tLS>KJ-7ǻGZU c|}nmw1Xc+u]ѭOl4(o캆݆Z,ƹ6h| Y߯y;mhH1"?qos] bDL ^}yc1iףz>6v&Ɔ |ӥҹ1L-*ޥZUmOkQHRUTӷ=6SU\ܖbիűGtG47φL 6f$Sij$,1cDĢ`RT/:јLOTIČ@KrbrZUiiJڞhV15JJx񋾰._Nƣ3Vkc'eqxnOI2iX`whOKYsݭt;T64uPKNL o>JbF}|ӥҹ1L-*ޥ_Ojҋ28mXRQ1lcxſh{clR5t]k0*ozgM kZLv5ڲڗ rijvLlw<|ۢc;9/% T3K.ɊeiUtSEXmFlkS^L_=g_ߴ}+D^naMϩM7 pgQڀrÖo8zW6'N3ځ02r}9\[fI:Fzp Vд$g:]+˒ijR J'-elcV[,i f4HKx Ng;oqͲ':Rm/0:=5{J&4uҷ*N`c}G[WȽ@Y7ۋxNJ2(ԣ`V-Oio@v 3qХˢ\`v}|,oEfIٵg}Pob=-a,ͺjRZ6|5#d$N65K.ØSCm|y) 5Z@r|0MUiԋZ='fO|n4+T-s_[ֶ{j 76 JeNielig4ɜ f}`9Լg=\hV龰rѧP:W5' ?/Fa+ܔյTZ{] Df mwsk- T>Pi5ͰmlD&7@k ݨס[m= y`-cXbF}-C2cAud:O61%g5@6, 01342@"!#$AP]ȼ)νӷOmZSԔuZr|qj5ZH;j5k_zIRs َ=j=v\ծj5kd{Ν_]wn5~-r0|x S%3mNҺWJ]+tS{K1o;(W&H LӋ %RJI*LuL->J鳯6_M{I~Sq{YӾ8rQp߅fuppģN}9YMe6)鷁.f5ޝޝG*FA8Z}nv*5IiU\b`a9&ޝYmeaXXXXhhhhX"ޔO'#h^,.7ſn^~0=N8Z};*rҍɰ^/Jo~8ܽ,az{I?8Z};/~~Smۊg~8ܽ,azx&|`7$=_g Oe෫.(_2:HN9I& v`c9٦agON #HDDkv]->v᰾:`ZkIr: fm<fJakfX0<%\4UW.#ؽ]cioe.xBphiy#<.11Nw0iUEeEbjR6S8Y̑O) ,gJ+Ze5cr[)[åwWe(^؜eETXS5Ӕip>97"uX;$PB䬕VJY+%eR)潻NvWl#:'+p/b ijf-Bv~?____Ik;62Zdu ȴ2@1ʕ+*VTYReJʕ*,G~yH+ڔ^%^ sA>ElNgZZZZZZtZkD!Iv$bE{6WϐSkXM!;'aمĺq~bjN۳5+;WNuU15c`O%&$/!dV: Ҳ5ib[RTah -N$ =WSRbt+@)νOo0'ڝ6u (p|2KS.`u *aq_BԿLeܩWpVR**no:D %@ [ ʫFG2spu6GZ} E/ -^t3A0]ؔ뤅Jd%'S7{ԻN{<nLލ+3%vnjoXu0%65ѽ$ Si*|%FK#)qE ];_UCy)/lFkwW"h/g}246"$y )5:B;9,ݳӤo0'bv ڔh[\\aJr"JsQoUTcVk i%rew( ^q})[ mba/ .L2&|pE=R:͒C+rL%i\#v?͸ iW n-#jS˛xvLTm[d# \gd .2|HbJ+U|.b~0c N1xvH*"#@!AiL ANeQ{KH&7僎\8!2 { »=Qt\b@7e؟ON𴗫%ix]RqQ8$Eoo0wΗ^ؕq`TTT{&pE&g3$!FU]D6|eAi K!bddbs Wз%/ ;d$V;K,z.͍NGj*^?T]Y!u6+yNi&`Sj~=G/1J&7Lp-d.5"nHR5w4dW5]h7==LH<؏ÊlxTu KiTz\8]Vd}c`2+w5UXV+4gP!ϊ䁨䁨:`BiۆY1:áQ{چd2t7"InDR*($Oc~4W"kQpWpWN.Mܞ0`@*ҭ(qä6mz׫^z wڴWJ ܈0x $HWWw7H}d EyW9;v.4 uT{4NT]Q }"+| Ŧ?~?j;Cx zW1FZ,@!Wg #d Sr0DЧ `Nz% Nmf" 8L,=B"=@@ TT`RDRO.'YUav`[TMjxό*"2ELxt$ 10!A"Q2@?=BOY8[HfՕORVV\Bu![.&HfAn_xr!5Ę~Z,Hw!ҥqH ?q.p N`17!ҥqJf n T(;BnAŴ@Qm "MmJ "/بxMmC "|b#:msslLu {﨤@\6Uf.ɳf+1<KWi.`>WE=6@Qm`z24ZGK#^v簾6!A\4k`t!nӐ:wxǎHEnکi ,7zv2tzAb<\&8W=CALuk c|'pwMAvtn:811L\c  䳐7d~‰`s&, .Hr\%Q79+b+[WT: !01Qq"23@AarBR#Pb`?ׄ6mW6 % UM_g-J!m&گm&گmɶjVayEWUM_UM_ULQOr(Hlg;=h4di/*JVmhdU ETbD,H1UZOV YNijh+#׹PBWݤ4t(PgUI};^,%PiMSwiI(e[@P9 _vu@>("^"4S*wRIZ$#/ʀr!릂шrz%_Lv󷙼o3yfX;dewPBWݤ4tX*觢U=*溂2;ܨ !+he=TS*mث;Q>r!릂׀tS*mث:qŒdGHܴ$f[j%VܞՊEҾ9Hh:'5J `ŽI}6lU:E4Ikh=L9 bx07+WnlTo2c!R&r$ęKd* TO12W(Z=Vt":EC%rIr^3UTFTM咁p KlvxfhMXJD(Q^fM]gNa":EtyͱBiq{O^Jlbt]!6")Ul:E`Cqm5ihTytitPm( sh4 lm A_6 Fl㊨ɫtŵOTͳ#8(_ןf5ٯkןf5٪Q)7Y@׵tq,nUGr~mVmVmVmVmVHmdDglӖ}$[ZnAhv[}Tӑt VaY R"/go8*BShDX4^-;BGf#٫t4].G2+F4t^崞(Avӂ@+wGYJbni[DiqT'hQmm)hAR7T 6Oo0&r ZfMkN٠A_ :UglxiPO+ڹǻjvxFl EqUn+锸vj? g韊s($7AVu5SSm XB7IGNB˷5*Y{Vv75GHh'hnDM5M'-mhf)P#IV1j`ӖO:SؗwYJ"o2g`ӖjiPQDMjSeӣt_)UȬ-Rh.Q>i4wYJ n]LKO-7R %~jU C*n{ȥ`"ѶvRyB)7Kƒ#:Ugmp`^H̥ۓ_HpH귞uH+tduzuΘdw\FBH.j8 OqdiٟP1M;ȵbm Osޝe* 0D*%NU@P;3{D]!JAbzNVs %`iu;3M>rU9,Ro[! g=bHP MP@եxf:Ugl@LP/.)-ed.(ByPx\E/#8**ػu['I:Ugas^״ңQ\\45많4LiC.,`JIp B] *K%Dp/'  l=WfvfndCQ)CK\B&&&&B ~S_Cnض߸l͆7.  n*GT29E9_(و:"Vk?+p*HqdUht+-3cfȆ>Zm_f<D H E/eLτYv> ;AVW|~RFoAáal[o6f`b{ȉb8(+-ǃ]XeHy "rq*Irn~Rmpٛ5ǰFwYھx:֟{Z?hG֏{SGa'[`_mpٛ51I Yھx:Thr T1[/Հ\Ǯض߸l͍b3}u!lKOD'P6vɶfll&>5 vd-Ƶ0RɄq9 Ј"!MWXၬJT =C3cf2댄pJX@aedu!p36EHs##`R ̇)'' $G`_ wc2(DR#s6f@KZxrqI/CN3B`kHi{\/!ro\^+depC&ϳ 537 F{#jJpS!,3` "t)2= O2ǁ%uh0,c`.MXm.T]utJ,< P[Q_!Hnije='/X 23PJ-x k*1>m ^dߪ f4z sBQ`sAG8߃xGq!Jhfz1'l9d2$>WBFT0?>-ԓܽcɱEETҏ5nWg,1?V&&\JOrgc+z_/c>#}]FOYw'p>my6 A9z^%@s#3`Q)ɈuL (E7Y31jch~w6, fx`*+ /TKo jv9 `?Bsjxb3GDٙiz ؤZyR $GzIT@۠Tx:~ypePĸXcxpzZ;'hmyE< 4xpq#(.Y#7wSCb@9Ps/A9 t٠lWEd:v7a ~'$] E 3C 1ǎw|D@4%;̠Ů _fCkea"b_9Գ|'EH[7K~܉Q9eL9Z@0eD%t ֊si9,,{1 :ܐr.iZ5^x^Dgx) K%12(ּdv9Zw6I6_큣~L^tV@@%pkT Ue7%:%dD"IW\EovvI8()˰_rAZhg_w0 VZ(H}fE 9 PiWA}`._ 0OidA߁kŭQK)aAG0'[I (Wfrb5~ m8%Uu) C$:Ԡ*r3,}z4T߿5 J?IAEU}w) C T*CAD= L!$2Q<-xߊ `GX  S),( J 2oJ=Z7]ڐ ? 5-Oi 0}O}7  b 8(_؞` + ? ,5 /} a:   0 &p-K_ ؔ Հ$B 4 -*   /W a 4  8 }F=J4(j @݋    /v}0&-tB &B" $}D!Q)$ Ҁ ( 0  AEBJ0 = C  0 ) .W} ?  P? X0B L]ނ 8D    $ ! !10AQaq@?ъ*ܖV qh"=zeie-1%Ke.(aŲ>%>1#Y'ɨ/RǬX`ieRq[zzcz ʋ¦!x/d1;g/ ׄsy:v:=1=qՊ-KOԧ̧̥wz ٰ42vXںxGYrĭ {11=qՋ)CK*Uq2 O;G"tAePO\*%ag, dTiFTS7}D/S#TO}0S8?W}_'WzLH,x`^ j>twӷ=rrAU,aU^Gh3G|=4iEKA,988m'_pp,UKnYW?8!n*'=Z6YoK0sV+lZPttmusQe,Q_$[pZm^uܼ1Yh bzv"l:a68­OIW_g`/ؽaR X|Gl+o)#WƣN(o |KRSnENZ ] ]'~u Ӊ)4Wæ-ʶJyyyyQ-)kBo 1 !0AaQq@?_Y!Z"0F»쒈5sOɲ+(Ae.SN2{=8{'G %a m|)}_Y=rՏNض|g|g&l|ƘV=8{'7cw|OE5ȯvtJMэ_x[ox B qui;=LgaT2c cjJ}.o Pq~̊!:o3pCi!T1ilDDڶ.5^D` {%`ue`Sxi5&Z"RY v684M,k& E ~~^Tw+3Bx5ΓxE,S,uh) Pi@9%6TDF.m5qکґ#?*Z_= P9QdQw,J1葾.}b*%p~yu-Cc=C[UQw@P^W~qZr7C0Y"eR^8ŕb+8blh$I> `cN/n;arQ6 6a^Vܪۍ#(_ebDQm$}C7 c i,OQTq91n'*_ep S@UMC J@|؆R@iE?) !1AQa 0q@?E%)gʲ:8.Yp0'igCHw-2IR9,2Ds8lI35.m Rֲ1BiB7? WO7*-'l2ѯрSB솾3ոH9Wp|֕}o(MbbTZҴ 6PWZ7]¹?&˄l6x[~+7+e8?oD33]ϡT5̣"+Bi-isC|B@djȱRLp9m8X#FJ;쑫P$7uvΤRYH%&5m HSm3{q[ -ڢYE'sېM-ٱbŋZ00w![.o+zۼk6\2D09-,߬wmm[Vյm[Vյ.Uլ "`%w Ws IW}Qèa=6"-/^  vn%xWRnn(Nd!,)` ~)LRx DE䠑_wJ^\U0n;FiE--`QkA Fz:m>"[pNh5eڠP7z+ef!+MQTvrL$g^!/mv5<8o7{-}&daqXD%nȳ'7E1bQRǕ睮 eK}]ecB##Xy9a񓌃%ALE},&̆ UӅp(@((kC؄cYOCWC)9AV6^mٶn42Q]πwxnd!Ƅ&yR7&r/(aUp /CntW˂ǝި)ZV\Zm+ $vUjUZVUِF!*4/|ڊqdt; 27&[>"ݟC% F{!xyR)2kA ,7o+-7e`0s:}B)T "#c(7|h!`kSt)-΂jiAՏU8wesmosI%fk7cRH Fqu@ ??k2e ]-ׁsj%`t{ E^Ӑ 5 ̓>gp '<;w??GT~ʏQ*??Gڟ_Y_G.<z膓si5ܝd EU%Y|6NhPOY K(/x] #ILĭл|Naw^!ER*SRSF 4qWݧ0,htAs* .DE?( igP (;U).]Ķj* KKHL~mty;P3MaA$UōyOmw7b6. ԰|0& ?4<” X Y朙fClp̼뵘nNP`Ðk۱@j,>Γ J%\|Q-d΍H^FÁ iGUVJW]v }+TٯU_"ͫ Ub@?Wcd-!_٘G 2^3mv;m}O _s,MK]*Ɏev?MȶһK|DE ~{0D..cJ|JPʮ?эymw7gN)rL+L `Jۜo(,W7]XRC}MiMs6MKAZs,߱J@.DUd})MtǡoH[W%A8_WW5\;Ƽ߻ަ|x~,O_ =\f`cE1"o69X3UiC//pڣ0Btʞ2r(ޙlA:v$=Etxov@ an/H~nͦobL{KS?=lL+FOm`慚&^ۍ"l?ƢdqMH#KS`HZMEa“V$u8ר=(ǚY2 Ni,X7|p%JlV^̕o*!!a$u\y1*Q3JYj+-7 'Wc׸rWi-| _kZ-4K1\*LJb_uT"'іTuUZ|־Ep&X3!c^FX?UDJ-Desktop-Client-0.6.4/admin/win/nsi/installer.ico0000775000175000017500000000566612051252546021605 0ustar kurtiskurtis & ( @{wpxwxwwpxxw~x ~pxxpxwpzxxpxzxxxwwwwwwwwwpwwwwwwwpwwwwwwwwxwxDDDDDOxvflOxwffOxvflOxwffOxvfOx~wfOxwvOxw~wOxDDDDDOxxp ??????( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&ززؕ؉嗜㜜㜕{{{{{{p ??????UDJ-Desktop-Client-0.6.4/admin/win/nsi/welcome.png0000664000175000017500000002460212051252546021241 0ustar kurtiskurtisPNG  IHDR=2sBIT|d pHYs.tEXtSoftwarewww.inkscape.org< IDATxyxՕ[{k_Ͳ,x !5L’|!L H&0/ I>@&L!C$lm0xWٖmIdɖu]wV˒ԫ~RwխӪ_>u )%YLt%K" :ˤ"+,L*,nP[%`O9LhVhRzٸHDC1  8$|PLJMq( ?ݲ[[]KUqirBׁ Gdɵ kKG]! %)Sfb7J)dJB\`5ؔiYMR^BAw/7l?Af戗2#wrJXqr(,)! 4AJpc=lY ]юz@Jy Z1X1 V"6r,Y.kzUJ)jƨ\9ɚYk3twCO~OR+:$B,:ɏ\j3im,!-')hc.qխ+ޤYjC|)ӐI+Qm$9_EgŜ%e+qO}T*h!\`wc_,w;bПӂ<%\z\(_O+gɒJ}*] =B(|Ru L! W|%K]y]U#ݟvo6U.)g}4.Y#Z娘 fP,  *5!f/)FLA(Kʢ.,iȒ%d8t~igɒ!D{9t۳rΒI;jY#Y9A:alA zPD݉_Rl*H;Ddv~4 ]8v ntw$yACe5 Mel*isM90AtCpϠ5q4nF%\,8l ?9s8 Ϭ%xf.ehʴ"Kz g[עtӇk۸ @ +_v ޺i-1C]h39^vۜStpo~WN?gp\z. g}s.qox7q8${S&/pѿRiXzbG?Xۜ`8LɯG+Op[~%4]ГȅvmYCr<1!Lr7~űO  /HI!(dгE!ΆwmJZg3\+mR\u9D`7!_ mNq6K垍|:jMIIaR(7H( RJ314H{ß9zӷOI Dsκ)"|I; łbaGX 44QXP8[qu1E.Qki_Q9؜NUndO #DL̚^^ӗLH}fC>~s?9vQ%akݏrh9 ivRж=|3SrND'%O܃}6J5D3V&?5bBNa!cwQTUecI(!gZƗh3?Rr͊NX?D¹{1H}ҟ܍yҞ䕔02,6۰hsHcxBV20Qnܣ+~&e-69 g(xBQ/-%(+*îɏbHI @@ r1$d/=-@SAo8P lY&drR ƯҖ*,VE+N\ zeTD4RRè=8q?%ys,ۄar|&vS ^Y!怔x{{x&OAޖ؆c)'T#_%DEWW7h.@WrDr?7""gr60f`ŵ%_x46Tʙ3),!B>w֤QN=J`h(޷1QB_/I'Fؾ§W|jN ̡Lj^?4Dw{;mm=)|h9x筈sxAۚ(=Fim-uu ".r$ZZjnF -@_7-jS7~vStG*X,(u(M7cOP{(zqg !3Šb)dޮ.ZmdC RĽhƮMSĽ TT 1}>v[G>,h ZT&tJyrй/qAٕ7"-2HQU5G S?.Wb ˁo7$Çٻaä̻HZϱ;~zJ%ۯHnf\o=;澁JοaV2{ XF%njXq -/+*7-%Ӧm2[ᅡG_rml˜eX,ڼws7_y _˞𡅧6}b aacؼ9g$I,3l^,JqS Ej,LHbƍEf\:Qz^F{h1oLWZ[)%xzzhܰ!"\o&F:IkC?awA#jah՚εϥیعW26?0j$Ef@drP ٜ4~iPiѹu/\򡠼2gG&bV+μӇtH&)C[nl˥ǙsI5E^sOg'_y%%+q͢K/%$N_)X]cRB`Zт(ZHKh2bʕ8rǁl}u|Ĕ5eq@_+FXr%vWۮ=G#䦔1Y:M G-`MZﬨ*s/@O~BwEKÍizݰmN's/EUSnY,?08R:K`iiQ9Qxz{ cYCNQ{֯OڹgSTĬsIE4"{HSm۽p$דڒ_\SCim-X&-=hƎ5kJԤ٪HmƄJ9V))4~hx_EUud1k>7)qY!uޱvmJ}X^v]nѢQ2 3hݽ8sxaznn/_>J̠ ~zݼ~=Kqsun 8Q>s8V:@{XX3A{CaH1kAKjLk۹{^cj]kq>F"O74#2PjOVc9*R؉b4MLtm(AQn6yS G,Ck*f*a$-b ;H~UUhAasy]ħo9n>}͜wE *Ql'ӈڛ$e͈ȯfK,sc%̎{|GښnG*}VD/ycLz;ߡ21%c++;1/XE5/@ r$P›B`s8LG6.첄c͐6#cYw"0T fJ;($XIaK&kHOPgBСѿd`H#K&!="z_#u7r"z53=t:f[Щs9X83D1S17Z}f1v'RxSV@3sEdTfb&ȎEfH3(d7;2ӿ݄=+4(nLc:cfܷqE_M&A#?+^ Z:FgeZ NG5rh 'e UB62{*}v82bBܓl?+Bnpc $pm„2j`ں?av^qUfu~&5۵;o )S#HgFrRSjSuqʶ9ՙ:}3XX O^¥)9x t,V+3/OE|9`yΤUv9#ݍЦ昻Kf6{Yw~wGj0s>3Rr`Z4BnQBU(Rsf~ɨOMޔeȊ:đm8Inh`+VZԐs4mBGSSRY6m.\604ĮujiIB8nnw84 iRZQV!˪G\=@`ŕ1,ZZk a,Y*`"(dɪU^",fo__{-bF +*t7#4)w#Jc`#9h^jf 6 S9s&BQp2ÇjnW22JNQՔԄG j=ܶm܃;f/)\BO :R˷~@Z-,Ca|LoFZvf…Ms ?#G *5`w\\.n7chji˖q-<,6UUNr3`Ԫ ڜe"rIk]5Ǯuh޹9s( 9OnMDZw2KԩzRGEi;λ*6%f#YҴ߅ -@ccصnB)d:|p;[R2{77p-蔺&'O#؝ο_̈́D!6?ݎ 3<70a0mG~ :^:p5`O_ɊV}/B 3/C fBBQ;jC+( %B$W-h>4]8R4%LgCjco`vyWAєnRq27BQ\]MYm툤#!li4RZ+IOEȥ6㴡pΟ?B1(8`zqS#"ӗ"!Rɫo) K  }Sw[ty-w4=ހI d }&)YMNa!3/GX{ЋAxi?`>FgU30qx# 8fLJJK9sJT%, #;;w4L~~2 ohs]wgY@3@spqU/ծ1݊B|s+یICቾ#PqpqB"Ӕt*2JڍK+L0u|- /)Z;]J9im8jZeU#=Uas:}NiӛwDGǸ#Q]oFC)eyٍs#b_R~L~Y.bRJd qMFFˆ=3!oJ2wALbQ3w.ufbh[R_ %c;fVVrgSP^>ZȑF e8 ZkNޒvU-q8".SO37qhadpZXH^~~G%^$KnCmIFͥ wAB4MB#!9‘F&\re8.ZG~z^N)iÕG)8rr~0zd^Hc#=GwsV!?h!Z p bOE ~aۻ&eXV\ 6#I0_<"7#(~u­GDnEWtlE=]aat[4T˅3/{94$%3KMXK q3}?@7R@CIBQyuXĚ6pIDAT 1G~@"N=?0R dvc,r ស#6hXnkb߆ V qP =1G zhp-M1w9! 1*V͈;ʑ ۜn?x{E jEZlX,='9854 η\#O/ԔuV_o\;.vym%k# bE|}eןI5cn}] ѯz,F^~pEqu q]HV?=P;[?ox.G$BA|^dI_ci&TBîD-$\t+;2!70? Bb=+;;&| dW|1cڏK&!Q ;T " MzMOZ5Laʗt填ք67q]{!rۺt[3(Rzh$B~?W ~+J9R7'yE=|q(\A , Z0?(*'C䓁WO:B >%"[IZl򑍮ĚhDݙ=IFIcF9b #{3h> Y>xEW_(F:QXq (g_F C-J PkR31%_#?t[ļsP>e6%19)sk4nûoا9c.(j3զwji`~q\|!+gcŨo侭h/x2 !?r͗_W1$8Οh{F.0JߦkΠ+?yK#whf:kI%9?e;~WEރO-""QT/Յ\33$DuչK3'h~NN3/O#7y 9_W2ܣsT-Q(yOhk_@67j?S3PV^Xq"M nTGڊmzǿiXR #X+(gܧGzISvtj^7|5澢qP_D[s2i+FYq9W#L5)%&c z7!a,Iz7pG=JG.2ҀUDnh 둍[<`"f,@]2w9bY'14U>G_3li}}W#o~8`?Y?z|UUsY 2 zlB6l܂l=LRވ(,CT!f,D=eb=2 V {04J0~oθ<`53je b9O? ٲy"=}Oң?A8w.|*Q51eeLbi2aa;O;p,m_ct#"&,"VE<[bqp!A`dvKuVC,Dzͨhj{|D%#Ʉ ڑ3GݜeUF = f,gEm󌅓!#%NTMF7_Q Sq]g,R5'{E]Mg<gU(`=dߚtMYF娙Aʫc6)8ݔ}ָ,yp-[G]0 3FWa)(;+of_1u|63?_ˀŬWSЛ.1~B՝ԯF̍)6w === # # Copyright 2011-2012, Dominik Schmidt # # Tomahawk is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Tomahawk is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Tomahawk. If not, see . # Shamelessly taken from the tomahawk project. All prasises to domme for setting # this up. # www.tomahawk-player.com if [ "$1" = "-c" ] ; then echo "Continuing last download.." rm -rvf vlc/ else echo "Update archive..." fi rm -rvf vlc/ echo "Download phonon archive..." # wget -c "http://downloads.sourceforge.net/project/vlc/1.1.9/win32/vlc-1.1.9-win32.7z?r=http%3A%2F%2Fwww.videolan.org%2Fvlc%2Fdownload-windows.html&ts=1306272584&use_mirror=leaseweb" # wget -c "http://download.tomahawk-player.org/tomahawk-vlc-0.1.zip" # wget -c http://people.videolan.org/~jb/phonon/phonon-vlc-last.7z # wget -c http://people.videolan.org/~jb/phonon/phonon_phonon-vlc_20111128.7z wget -c http://download.tomahawk-player.org/test/pvlc.tar.bz2 echo "Extract binary..." # 7z x phonon*.7z # mv -v vlc-*/ vlc/ # unzip tomahawk-vlc-0.1.zip tar xvjf pvlc.tar.bz2 # echo "Download phonon_vlc_no_video.dll..." # wget -c http://people.videolan.org/~jb/phonon/phonon_vlc_no_video.dll # cp -v phonon_vlc_no_video.dll prefix/bin/phonon_backend/phonon_vlc.dll # echo "Strip unneeded plugins from vlc/plugins..." # cd prefix/bin/plugins # rm -rvf libold* libvcd* libdvd* liblibass* libx264* libschroe* liblibmpeg2* \ # libstream_out_* libmjpeg_plugin* libh264_plugin* libzvbi_plugin* lib*sub* \ # *qt4* *skins2* libaccess_bd_plugin.dll \ # libaudiobargraph_* libball_plugin.dll \ # libdirac_plugin.dll \ # libgnutls_plugin.dll \ # libcaca_plugin.dll \ # libfreetype_plugin.dll \ # libaccess_output_shout_plugin.dll \ # libremoteosd_plugin.dll \ # libsdl_image_plugin.dll \ # libvout_sdl_plugin.dll \ # libpng_plugin.dll \ # libgoom_plugin.dll \ # libatmo_plugin.dll \ # libmux_ts_plugin.dll \ # libkate_plugin.dll \ # libtaglib_plugin.dll # this is for vlc-2.x rm -rvf \ video_*/ \ gui/ \ **/libold* \ **/libvcd* \ **/libdvd* \ **/liblibass* \ **/libx264* \ **/libschroe* \ **/liblibmpeg2* \ **/libstream_out_* \ **/libmjpeg_plugin* \ **/libh264_plugin* \ **/libzvbi_plugin* \ **/lib*sub* \ services_discovery/ \ visualization/ \ control/ \ misc/ \ **/libi420* \ **/libi422* \ mux/ \ stream_filter/ \ **/libtheora_plugin* \ **/liblibbluray_plugin* \ **/libdtv_plugin* echo "Downloaded and stripped VLC" UDJ-Desktop-Client-0.6.4/admin/mac/0000775000175000017500000000000012051252546016246 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/admin/mac/qt.conf0000664000175000017500000000003512051252546017537 0ustar kurtiskurtis[Paths] Plugins = qt-plugins UDJ-Desktop-Client-0.6.4/admin/mac/macdeploy.py0000775000175000017500000003615512051252546020612 0ustar kurtiskurtis#!/usr/bin/python # This file is part of UDJ. # It was inspired in large part by the macdeploy script in Clementine. # # Copyright 2012, Kurtis L. Nusbaum # Copyright 2010, David Sansome # # Clementine is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Clementine is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Clementine. If not, see . import os import re import subprocess import commands import sys FRAMEWORK_SEARCH_PATH=[ '/Library/Frameworks', os.path.join(os.environ['HOME'], 'Library/Frameworks') ] LIBRARY_SEARCH_PATH=['/usr/local/lib', '/usr/local/Cellar/gettext/0.18.1.1/lib', '.'] VLC_PLUGINS=[ 'libaccess_attachment_plugin.dylib', #'libaccess_avio_plugin.dylib', #'libaccess_fake_plugin.dylib', 'libaccess_ftp_plugin.dylib', 'libaccess_http_plugin.dylib', 'libaccess_imem_plugin.dylib', #'libaccess_mmap_plugin.dylib', 'libaccess_mms_plugin.dylib', 'libaccess_realrtsp_plugin.dylib', 'libaccess_tcp_plugin.dylib', 'libaccess_udp_plugin.dylib', 'libcdda_plugin.dylib', 'libfilesystem_plugin.dylib', 'libqtcapture_plugin.dylib', 'librtp_plugin.dylib', 'libzip_plugin.dylib', 'libaccess_output_dummy_plugin.dylib', 'libaccess_output_file_plugin.dylib', 'libaccess_output_http_plugin.dylib', 'libaccess_output_shout_plugin.dylib', 'libaccess_output_udp_plugin.dylib', 'liba52tofloat32_plugin.dylib', 'liba52tospdif_plugin.dylib', 'libaudio_format_plugin.dylib', 'libaudiobargraph_a_plugin.dylib', 'libchorus_flanger_plugin.dylib', 'libconverter_fixed_plugin.dylib', 'libdolby_surround_decoder_plugin.dylib', 'libdtstofloat32_plugin.dylib', 'libdtstospdif_plugin.dylib', 'libequalizer_plugin.dylib', 'libheadphone_channel_mixer_plugin.dylib', 'libmono_plugin.dylib', 'libmpgatofixed32_plugin.dylib', 'libnormvol_plugin.dylib', 'libparam_eq_plugin.dylib', 'libscaletempo_plugin.dylib', 'libsimple_channel_mixer_plugin.dylib', 'libspatializer_plugin.dylib', 'libtrivial_channel_mixer_plugin.dylib', 'libugly_resampler_plugin.dylib', 'libfloat32_mixer_plugin.dylib', #'libspdif_mixer_plugin.dylib', #'libtrivial_mixer_plugin.dylib', 'libaout_file_plugin.dylib', 'libauhal_plugin.dylib', 'liba52_plugin.dylib', 'libadpcm_plugin.dylib', 'libaes3_plugin.dylib', 'libaraw_plugin.dylib', 'libavcodec_plugin.dylib', 'libcc_plugin.dylib', 'libcdg_plugin.dylib', 'libdts_plugin.dylib', 'libfaad_plugin.dylib', #'libfake_plugin.dylib', 'libflac_plugin.dylib', 'libfluidsynth_plugin.dylib', #'libinvmem_plugin.dylib', 'liblpcm_plugin.dylib', 'libmpeg_audio_plugin.dylib', 'libpng_plugin.dylib', 'librawvideo_plugin.dylib', 'libspeex_plugin.dylib', 'libspudec_plugin.dylib', 'libtheora_plugin.dylib', 'libtwolame_plugin.dylib', 'libvorbis_plugin.dylib', 'libgestures_plugin.dylib', 'libhotkeys_plugin.dylib', 'libmotion_plugin.dylib', 'libnetsync_plugin.dylib', #'libsignals_plugin.dylib', 'libaiff_plugin.dylib', 'libasf_plugin.dylib', 'libau_plugin.dylib', #'libavformat_plugin.dylib', 'libavi_plugin.dylib', 'libdemux_cdg_plugin.dylib', 'libdemuxdump_plugin.dylib', 'libdirac_plugin.dylib', 'libes_plugin.dylib', 'libflacsys_plugin.dylib', 'liblive555_plugin.dylib', 'libmkv_plugin.dylib', 'libmod_plugin.dylib', 'libmp4_plugin.dylib', 'libmpc_plugin.dylib', 'libmpgv_plugin.dylib', 'libnsc_plugin.dylib', 'libnsv_plugin.dylib', 'libnuv_plugin.dylib', 'libogg_plugin.dylib', 'libplaylist_plugin.dylib', 'libps_plugin.dylib', 'libpva_plugin.dylib', 'librawaud_plugin.dylib', 'librawdv_plugin.dylib', 'librawvid_plugin.dylib', 'libreal_plugin.dylib', 'libsmf_plugin.dylib', 'libts_plugin.dylib', 'libtta_plugin.dylib', 'libty_plugin.dylib', 'libvc1_plugin.dylib', 'libvoc_plugin.dylib', 'libwav_plugin.dylib', 'libxa_plugin.dylib', 'libfolder_plugin.dylib', 'libtaglib_plugin.dylib', 'libaudioscrobbler_plugin.dylib', 'libdummy_plugin.dylib', 'libexport_plugin.dylib', 'libfreetype_plugin.dylib', 'libgnutls_plugin.dylib', 'liblogger_plugin.dylib', 'liblua_plugin.dylib', 'libosd_parser_plugin.dylib', 'libquartztext_plugin.dylib', 'libstats_plugin.dylib', 'libvod_rtsp_plugin.dylib', 'libxml_plugin.dylib', #'libxtag_plugin.dylib', 'libi420_rgb_mmx_plugin.dylib', 'libi420_yuy2_mmx_plugin.dylib', 'libi422_yuy2_mmx_plugin.dylib', 'libmemcpymmx_plugin.dylib', 'libmemcpymmxext_plugin.dylib', 'libmux_asf_plugin.dylib', 'libmux_avi_plugin.dylib', 'libmux_dummy_plugin.dylib', 'libmux_mp4_plugin.dylib', 'libmux_mpjpeg_plugin.dylib', 'libmux_ogg_plugin.dylib', 'libmux_ps_plugin.dylib', 'libmux_ts_plugin.dylib', 'libmux_wav_plugin.dylib', 'libpacketizer_copy_plugin.dylib', 'libpacketizer_dirac_plugin.dylib', 'libpacketizer_flac_plugin.dylib', 'libpacketizer_h264_plugin.dylib', 'libpacketizer_mlp_plugin.dylib', 'libpacketizer_mpeg4audio_plugin.dylib', 'libpacketizer_mpeg4video_plugin.dylib', 'libpacketizer_mpegvideo_plugin.dylib', 'libpacketizer_vc1_plugin.dylib', 'libi420_rgb_sse2_plugin.dylib', 'libi420_yuy2_sse2_plugin.dylib', 'libi422_yuy2_sse2_plugin.dylib', 'libdecomp_plugin.dylib', 'libstream_filter_rar_plugin.dylib', 'libstream_filter_record_plugin.dylib', 'libvisual_plugin.dylib', ] VLC_SEARCH_PATH=[ '/usr/local/lib/vlc/plugins/', ] QT_PLUGINS = [ 'crypto/libqca-ossl.dylib', 'phonon_backend/phonon_vlc.so', 'sqldrivers/libqsqlite.dylib', 'imageformats/libqgif.dylib', 'imageformats/libqico.dylib', 'imageformats/libqjpeg.dylib', 'imageformats/libqmng.dylib', ] QT_PLUGINS_SEARCH_PATH=[ '/usr/local/Cellar/qt/4.8.2/plugins', ] class Error(Exception): pass class CouldNotFindQtPluginErrorFindFrameworkError(Error): pass class InstallNameToolError(Error): pass class CouldNotFindQtPluginError(Error): pass class CouldNotFindVLCPluginError(Error): pass if len(sys.argv) < 2: print 'Usage: %s ' % sys.argv[0] bundle_dir = sys.argv[1] bundle_name = os.path.basename(bundle_dir).split('.')[0] commands = [] binary_dir = os.path.join(bundle_dir, 'Contents', 'MacOS') frameworks_dir = os.path.join(bundle_dir, 'Contents', 'Frameworks') commands.append(['mkdir', '-p', frameworks_dir]) resources_dir = os.path.join(bundle_dir, 'Contents', 'Resources') commands.append(['mkdir', '-p', resources_dir]) plugins_dir = os.path.join(bundle_dir, 'Contents', 'qt-plugins') binary = os.path.join(bundle_dir, 'Contents', 'MacOS', bundle_name) fixed_libraries = [] fixed_frameworks = [] def GetBrokenLibraries(binary): #print "Checking libs for binary: %s" % binary output = subprocess.Popen(['otool', '-L', binary], stdout=subprocess.PIPE).communicate()[0] broken_libs = { 'frameworks': [], 'libs': []} for line in [x.split(' ')[0].lstrip() for x in output.split('\n')[1:]]: #print "Checking line: %s" % line if not line: # skip empty lines continue if os.path.basename(binary) == os.path.basename(line): #print "mnope %s-%s" % (os.path.basename(binary), os.path.basename(line)) continue if re.match(r'^\s*/System/', line): continue # System framework elif re.match(r'^\s*/usr/lib/', line): #print "unix style system lib" continue # unix style system library elif re.match(r'Breakpad', line): continue # Manually added by cmake. elif re.match(r'^\s*@executable_path', line) or re.match(r'^\s*@loader_path', line): # Potentially already fixed library if '.framework' in line: relative_path = os.path.join(*line.split('/')[3:]) if not os.path.exists(os.path.join(frameworks_dir, relative_path)): broken_libs['frameworks'].append(relative_path) else: relative_path = os.path.join(*line.split('/')[1:]) #print "RELPATH %s %s" % (relative_path, os.path.join(binary_dir, relative_path)) if not os.path.exists(os.path.join(binary_dir, relative_path)): broken_libs['libs'].append(relative_path) elif re.search(r'\w+\.framework', line): broken_libs['frameworks'].append(line) else: broken_libs['libs'].append(line) return broken_libs def FindFramework(path): for search_path in FRAMEWORK_SEARCH_PATH: abs_path = os.path.join(search_path, path) if os.path.exists(abs_path): return abs_path raise CouldNotFindFrameworkError(path) def FindLibrary(path): if os.path.exists(path): return path for search_path in LIBRARY_SEARCH_PATH: abs_path = os.path.join(search_path, path) if os.path.exists(abs_path): return abs_path else: # try harder---look for lib name in library folders newpath = os.path.join(search_path,os.path.basename(path)) if os.path.exists(newpath): return newpath return "" #raise CouldNotFindFrameworkError(path) def FixAllLibraries(broken_libs): for framework in broken_libs['frameworks']: FixFramework(framework) for lib in broken_libs['libs']: FixLibrary(lib) def FixFramework(path): if path in fixed_libraries: return else: fixed_libraries.append(path) abs_path = FindFramework(path) broken_libs = GetBrokenLibraries(abs_path) FixAllLibraries(broken_libs) new_path = CopyFramework(abs_path) id = os.sep.join(new_path.split(os.sep)[3:]) FixFrameworkId(new_path, id) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, new_path) for library in broken_libs['libs']: FixLibraryInstallPath(library, new_path) def FixLibrary(path): if path in fixed_libraries or FindSystemLibrary(os.path.basename(path)) is not None: return else: fixed_libraries.append(path) abs_path = FindLibrary(path) if abs_path == "": print "Could not resolve %s, not fixing!" % path return broken_libs = GetBrokenLibraries(abs_path) FixAllLibraries(broken_libs) new_path = CopyLibrary(abs_path) FixLibraryId(new_path) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, new_path) for library in broken_libs['libs']: FixLibraryInstallPath(library, new_path) def FixVLCPlugin(abs_path, subdir): broken_libs = GetBrokenLibraries(abs_path) FixAllLibraries(broken_libs) #print "Copying plugin....%s %s %s" % (plugins_dir, subdir, os.path.join(abs_path.split('/')[-2:])) new_path = os.path.join(plugins_dir, subdir, os.path.basename(abs_path)) args = ['mkdir', '-p', os.path.dirname(new_path)] commands.append(args) args = ['ditto', '--arch=i386', '--arch=x86_64', abs_path, new_path] commands.append(args) args = ['chmod', 'u+w', new_path] commands.append(args) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, new_path) for library in broken_libs['libs']: FixLibraryInstallPath(library, new_path) def FixPlugin(abs_path, subdir): broken_libs = GetBrokenLibraries(abs_path) FixAllLibraries(broken_libs) new_path = CopyPlugin(abs_path, subdir) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, new_path) for library in broken_libs['libs']: FixLibraryInstallPath(library, new_path) def FixBinary(path): broken_libs = GetBrokenLibraries(path) FixAllLibraries(broken_libs) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, path) for library in broken_libs['libs']: FixLibraryInstallPath(library, path) def CopyLibrary(path): new_path = os.path.join(frameworks_dir, os.path.basename(path)) args = ['ditto', '--arch=i386', '--arch=x86_64', path, new_path] commands.append(args) args = ['chmod', 'u+w', new_path] commands.append(args) return new_path def CopyPlugin(path, subdir): new_path = os.path.join(plugins_dir, subdir, os.path.basename(path)) args = ['mkdir', '-p', os.path.dirname(new_path)] commands.append(args) args = ['ditto', '--arch=i386', '--arch=x86_64', path, new_path] commands.append(args) args = ['chmod', 'u+w', new_path] commands.append(args) return new_path def CopyFramework(path): parts = path.split(os.sep) for i, part in enumerate(parts): if re.match(r'\w+\.framework', part): full_path = os.path.join(frameworks_dir, *parts[i:-1]) break args = ['mkdir', '-p', full_path] commands.append(args) args = ['ditto', '--arch=i386', '--arch=x86_64', path, full_path] commands.append(args) args = ['chmod', 'u+w', os.path.join(full_path, parts[-1])] commands.append(args) menu_nib = os.path.join(os.path.split(path)[0], 'Resources', 'qt_menu.nib') if os.path.exists(menu_nib): args = ['cp', '-r', menu_nib, resources_dir] commands.append(args) return os.path.join(full_path, parts[-1]) def FixId(path, library_name): id = '@executable_path/../Frameworks/%s' % library_name args = ['install_name_tool', '-id', id, path] commands.append(args) def FixLibraryId(path): library_name = os.path.basename(path) FixId(path, library_name) def FixFrameworkId(path, id): FixId(path, id) def FixInstallPath(library_path, library, new_path): args = ['install_name_tool', '-change', library_path, new_path, library] commands.append(args) def FindSystemLibrary(library_name): for path in ['/lib', '/usr/lib']: full_path = os.path.join(path, library_name) if os.path.exists(full_path): return full_path return None def FixLibraryInstallPath(library_path, library): system_library = FindSystemLibrary(os.path.basename(library_path)) if system_library is None: new_path = '@executable_path/../Frameworks/%s' % os.path.basename(library_path) FixInstallPath(library_path, library, new_path) else: FixInstallPath(library_path, library, system_library) def FixFrameworkInstallPath(library_path, library): parts = library_path.split(os.sep) for i, part in enumerate(parts): if re.match(r'\w+\.framework', part): full_path = os.path.join(*parts[i:]) break new_path = '@executable_path/../Frameworks/%s' % full_path FixInstallPath(library_path, library, new_path) def FindQtPlugin(name): for path in QT_PLUGINS_SEARCH_PATH: if os.path.exists(path): if os.path.exists(os.path.join(path, name)): return os.path.join(path, name) raise CouldNotFindQtPluginError(name) def FindVLCPlugin(name): for path in VLC_SEARCH_PATH: if os.path.exists(path): if os.path.exists(os.path.join(path, name)): return os.path.join(path, name) raise CouldNotFindVLCPluginError(name) FixBinary(binary) for plugin in VLC_PLUGINS: FixVLCPlugin(FindVLCPlugin(plugin), '../plugins') for plugin in QT_PLUGINS: FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin)) if len(sys.argv) <= 2: print 'Would run %d commands:' % len(commands) for command in commands: print ' '.join(command) print 'OK?' raw_input() for command in commands: p = subprocess.Popen(command) os.waitpid(p.pid, 0) UDJ-Desktop-Client-0.6.4/admin/mac/makeMacInstaller.sh0000775000175000017500000000167412051252546022031 0ustar kurtiskurtis#!/bin/bash # Copyright 2012 Kurtis L. Nusbaum # # This file is part of UDJ. # # UDJ is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # UDJ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with UDJ. If not, see . python ../admin/mac/macdeploy.py src/UDJ.app cp ../admin/mac/qt.conf src/UDJ.app/Contents/Resources/ mv src/UDJ.app/Contents/plugins src/UDJ.app/Contents/Frameworks #cp -R /Library/Frameworks/Sparkle.framework Contents/Frameworks ../admin/mac/create-dmg.sh src/UDJ.app UDJ-Desktop-Client-0.6.4/admin/mac/create-dmg.sh0000775000175000017500000000465712051252546020631 0ustar kurtiskurtis#!/bin/sh # === This file is part of Tomahawk Player - === # # Copyright 2011, John Maguire # # Tomahawk is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Tomahawk is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Tomahawk. If not, see . # author: max@last.fm, muesli@tomahawk-player.org # brief: Produces a compressed DMG from a bundle directory # usage: Pass the bundle directory as the only parameter # note: This script depends on the UDJ build system, and must be run from # the build directory #Shamelessly stolen from the tomahawk project. Super thanks to them. ################################################################################ #if [ -z $VERSION ] #then # echo VERSION must be set # exit 2 #fi if [ -z "$1" ] then echo "Please pass the bundle.app directory as the first parameter." exit 3 fi ################################################################################ NAME=$(basename "$1" | perl -pe 's/(.*).app/\1/') IN="$1" TMP="dmg/$NAME" OUT="$NAME.dmg" mkdir -p "$TMP" ################################################################################ # clean up rm -rf "$TMP" rm -f "$OUT" # create DMG contents and copy files mkdir "$TMP" #mkdir -p "$TMP/.background" #cp ../admin/mac/dmg_background.png "$TMP/.background/background.png" #cp ../admin/mac/DS_Store.in "$TMP/.DS_Store" #chmod go-rwx "$TMP/.DS_Store" ln -s /Applications "$TMP/Applications" # copies the prepared bundle into the dir that will become the DMG cp -R "$IN" "$TMP" # create hdiutil makehybrid -hfs -hfs-volume-name UDJ -hfs-openfolder "$TMP" "$TMP" -o tmp.dmg hdiutil convert -format UDZO -imagekey zlib-level=9 tmp.dmg -o "$OUT" # cleanup rm tmp.dmg #hdiutil create -srcfolder "$TMP" \ # -format UDZO -imagekey zlib-level=9 \ # -scrub \ # "$OUT" \ # || die "Error creating DMG :(" # done ! echo 'DMG size:' `du -hs "$OUT" | awk '{print $1}'` UDJ-Desktop-Client-0.6.4/ChangeLog0000664000175000017500000000060412051252546016170 0ustar kurtiskurtisVersion 0.5.0 Initial version of the UDJ Player Version 0.5.1 Fixed playback issues for Windows player. Windows player now has an updater. Version 0.6.0 Upgrade client to work with new API Fixed numerous playback errors Fixed numerous reauthentication errors Version 0.6.1 Added view of current participants Version 0.6.2 Fixed some linux things Version 0.6.3 Fixed player creation UDJ-Desktop-Client-0.6.4/cmake/0000775000175000017500000000000012051252546015476 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/cmake/modules/0000775000175000017500000000000012051252546017146 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/cmake/modules/FindPhonon.cmake0000664000175000017500000000641212051252546022215 0ustar kurtiskurtis# Find libphonon # Once done this will define # # PHONON_FOUND - system has Phonon Library # PHONON_INCLUDES - the Phonon include directory # PHONON_LIBS - link these to use Phonon # PHONON_VERSION - the version of the Phonon Library # Copyright (c) 2008, Matthias Kretz # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro(_phonon_find_version) set(_phonon_namespace_header_file "${PHONON_INCLUDE_DIR}/phonon/phononnamespace.h") if (APPLE AND EXISTS "${PHONON_INCLUDE_DIR}/Headers/phononnamespace.h") set(_phonon_namespace_header_file "${PHONON_INCLUDE_DIR}/Headers/phononnamespace.h") endif (APPLE AND EXISTS "${PHONON_INCLUDE_DIR}/Headers/phononnamespace.h") file(READ ${_phonon_namespace_header_file} _phonon_header LIMIT 5000 OFFSET 1000) string(REGEX MATCH "define PHONON_VERSION_STR \"(4\\.[0-9]+\\.[0-9a-z]+)\"" _phonon_version_match "${_phonon_header}") set(PHONON_VERSION "${CMAKE_MATCH_1}") message(STATUS "Phonon Version: ${PHONON_VERSION}") endmacro(_phonon_find_version) if(PHONON_FOUND) # Already found, nothing more to do except figuring out the version _phonon_find_version() else(PHONON_FOUND) if(PHONON_INCLUDE_DIR AND PHONON_LIBRARY) set(PHONON_FIND_QUIETLY TRUE) endif(PHONON_INCLUDE_DIR AND PHONON_LIBRARY) # As discussed on kde-buildsystem: first look at CMAKE_PREFIX_PATH, then at the suggested PATHS (kde4 install dir) find_library(PHONON_LIBRARY NAMES phonon PATHS ${KDE4_LIB_INSTALL_DIR} ${QT_LIBRARY_DIR} NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH) # then at the default system locations (CMAKE_SYSTEM_PREFIX_PATH, i.e. /usr etc.) find_library(PHONON_LIBRARY NAMES phonon HINTS "$ENV{PHONON_DIR}" "$ENV{PHONON_DIR}/lib" ) find_path(PHONON_INCLUDE_DIR NAMES phonon/phonon_export.h PATHS ${KDE4_INCLUDE_INSTALL_DIR} ${QT_INCLUDE_DIR} ${INCLUDE_INSTALL_DIR} NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH) find_path(PHONON_INCLUDE_DIR NAMES phonon/phonon_export.h HINTS "$ENV{PHONON_DIR}" "$ENV{PHONON_DIR}/include") if(PHONON_INCLUDE_DIR AND PHONON_LIBRARY) set(PHONON_LIBS ${phonon_LIB_DEPENDS} ${PHONON_LIBRARY}) set(PHONON_INCLUDES ${PHONON_INCLUDE_DIR}/KDE ${PHONON_INCLUDE_DIR}) set(PHONON_FOUND TRUE) _phonon_find_version() else(PHONON_INCLUDE_DIR AND PHONON_LIBRARY) set(PHONON_FOUND FALSE) endif(PHONON_INCLUDE_DIR AND PHONON_LIBRARY) if(PHONON_FOUND) if(NOT PHONON_FIND_QUIETLY) message(STATUS "Found Phonon: ${PHONON_LIBRARY}") message(STATUS "Found Phonon Includes: ${PHONON_INCLUDES}") endif(NOT PHONON_FIND_QUIETLY) else(PHONON_FOUND) if(Phonon_FIND_REQUIRED) if(NOT PHONON_INCLUDE_DIR) message(STATUS "Phonon includes NOT found!") endif(NOT PHONON_INCLUDE_DIR) if(NOT PHONON_LIBRARY) message(STATUS "Phonon library NOT found!") endif(NOT PHONON_LIBRARY) message(FATAL_ERROR "Phonon library or includes NOT found!") else(Phonon_FIND_REQUIRED) message(STATUS "Unable to find Phonon") endif(Phonon_FIND_REQUIRED) endif(PHONON_FOUND) mark_as_advanced(PHONON_INCLUDE_DIR PHONON_LIBRARY PHONON_INCLUDES) endif(PHONON_FOUND) UDJ-Desktop-Client-0.6.4/cmake/modules/FindOpenSSLCross.cmake0000664000175000017500000002223612051252546023253 0ustar kurtiskurtis# - Try to find the OpenSSL encryption library # Once done this will define # # OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL # # Read-Only variables: # OPENSSL_FOUND - system has the OpenSSL library # OPENSSL_INCLUDE_DIR - the OpenSSL include directory # OPENSSL_LIBRARIES - The libraries needed to use OpenSSL # OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) #============================================================================= # Copyright 2006-2009 Kitware, Inc. # Copyright 2006 Alexander Neundorf # Copyright 2009-2011 Mathieu Malaterre # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) if (UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_OPENSSL QUIET openssl) endif (UNIX) # http://www.slproweb.com/products/Win32OpenSSL.html SET(_OPENSSL_ROOT_HINTS $ENV{OPENSSL_ROOT_DIR} ${OPENSSL_ROOT_DIR} "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]" "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]" ) SET(_OPENSSL_ROOT_PATHS "$ENV{PROGRAMFILES}/OpenSSL" "$ENV{PROGRAMFILES}/OpenSSL-Win32" "$ENV{PROGRAMFILES}/OpenSSL-Win64" "C:/OpenSSL/" "C:/OpenSSL-Win32/" "C:/OpenSSL-Win64/" ) SET(_OPENSSL_ROOT_HINTS_AND_PATHS HINTS ${_OPENSSL_ROOT_HINTS} PATHS ${_OPENSSL_ROOT_PATHS} ) FIND_PATH(OPENSSL_INCLUDE_DIR NAMES openssl/ssl.h HINTS ${_OPENSSL_INCLUDEDIR} ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES include ) IF(WIN32 AND NOT CYGWIN) # MINGW should go here too IF(MSVC) # /MD and /MDd are the standard values - if someone wants to use # others, the libnames have to change here too # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b # TODO: handle /MT and static lib # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix: # * MD for dynamic-release # * MDd for dynamic-debug # * MT for static-release # * MTd for static-debug # Implementation details: # We are using the libraries located in the VC subdir instead of the parent directory eventhough : # libeay32MD.lib is identical to ../libeay32.lib, and # ssleay32MD.lib is identical to ../ssleay32.lib FIND_LIBRARY(LIB_EAY_DEBUG NAMES libeay32MDd libeay32 ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "VC" "lib/VC" ) FIND_LIBRARY(LIB_EAY_RELEASE NAMES libeay32MD libeay32 ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "VC" "lib/VC" ) FIND_LIBRARY(SSL_EAY_DEBUG NAMES ssleay32MDd ssleay32 ssl ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "VC" "lib/VC" ) FIND_LIBRARY(SSL_EAY_RELEASE NAMES ssleay32MD ssleay32 ssl ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "VC" "lib/VC" ) if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) set( OPENSSL_LIBRARIES optimized ${SSL_EAY_RELEASE} debug ${SSL_EAY_DEBUG} optimized ${LIB_EAY_RELEASE} debug ${LIB_EAY_DEBUG} ) else() set( OPENSSL_LIBRARIES ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE} ) endif() MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE) MARK_AS_ADVANCED(LIB_EAY_DEBUG LIB_EAY_RELEASE) ELSEIF(MINGW) # same player, for MingW FIND_LIBRARY(LIB_EAY NAMES libeay32 crypto ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "lib/MinGW" ) FIND_LIBRARY(SSL_EAY NAMES ssleay32 ssl ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib" "lib/MinGW" ) MARK_AS_ADVANCED(SSL_EAY LIB_EAY) set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) ELSE(MSVC) # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues: FIND_LIBRARY(LIB_EAY NAMES libeay32 HINTS ${_OPENSSL_LIBDIR} ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES lib ) FIND_LIBRARY(SSL_EAY NAMES ssleay32 HINTS ${_OPENSSL_LIBDIR} ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES lib ) MARK_AS_ADVANCED(SSL_EAY LIB_EAY) set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) ENDIF(MSVC) ELSE(WIN32 AND NOT CYGWIN) FIND_LIBRARY(OPENSSL_SSL_LIBRARY NAMES ssl ssleay32 ssleay32MD HINTS ${_OPENSSL_LIBDIR} ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES lib ) FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARY NAMES crypto HINTS ${_OPENSSL_LIBDIR} ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES lib ) MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) # compat defines SET(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) SET(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) ENDIF(WIN32 AND NOT CYGWIN) function(from_hex HEX DEC) string(TOUPPER "${HEX}" HEX) set(_res 0) string(LENGTH "${HEX}" _strlen) while (_strlen GREATER 0) math(EXPR _res "${_res} * 16") string(SUBSTRING "${HEX}" 0 1 NIBBLE) string(SUBSTRING "${HEX}" 1 -1 HEX) if (NIBBLE STREQUAL "A") math(EXPR _res "${_res} + 10") elseif (NIBBLE STREQUAL "B") math(EXPR _res "${_res} + 11") elseif (NIBBLE STREQUAL "C") math(EXPR _res "${_res} + 12") elseif (NIBBLE STREQUAL "D") math(EXPR _res "${_res} + 13") elseif (NIBBLE STREQUAL "E") math(EXPR _res "${_res} + 14") elseif (NIBBLE STREQUAL "F") math(EXPR _res "${_res} + 15") else() math(EXPR _res "${_res} + ${NIBBLE}") endif() string(LENGTH "${HEX}" _strlen) endwhile() set(${DEC} ${_res} PARENT_SCOPE) endfunction(from_hex) if (OPENSSL_INCLUDE_DIR) if (_OPENSSL_VERSION) set(OPENSSL_VERSION "${_OPENSSL_VERSION}") elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") # The version number is encoded as 0xMNNFFPPS: major minor fix patch status # The status gives if this is a developer or prerelease and is ignored here. # Major, minor, and fix directly translate into the version numbers shown in # the string. The patch field translates to the single character suffix that # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so # on. string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") from_hex("${OPENSSL_VERSION_PATCH}" _tmp) # 96 is the ASCII code of 'a' minus 1 math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") unset(_tmp) # Once anyone knows how OpenSSL would call the patch versions beyond 'z' # this should be updated to handle that, too. This has not happened yet # so it is simply ignored here for now. string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) endif (NOT OPENSSL_VERSION_PATCH STREQUAL "00") set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") endif (_OPENSSL_VERSION) endif (OPENSSL_INCLUDE_DIR) include(FindPackageHandleStandardArgs) if (OPENSSL_VERSION) find_package_handle_standard_args(OpenSSL REQUIRED_VARS OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR VERSION_VAR OPENSSL_VERSION FAIL_MESSAGE "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" ) else (OPENSSL_VERSION) find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR ) endif (OPENSSL_VERSION) MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) UDJ-Desktop-Client-0.6.4/cmake/modules/FindLIBVLC.cmake0000664000175000017500000000700412051252546021725 0ustar kurtiskurtis # CMake module to search for LIBVLC (VLC library) # Authors: Rohit Yadav # Harald Sitter # # If it's found it sets LIBVLC_FOUND to TRUE # and following variables are set: # LIBVLC_INCLUDE_DIR # LIBVLC_LIBRARY # LIBVLC_VERSION if(NOT LIBVLC_MIN_VERSION) set(LIBVLC_MIN_VERSION "0.0") endif(NOT LIBVLC_MIN_VERSION) # find_path and find_library normally search standard locations # before the specified paths. To search non-standard paths first, # FIND_* is invoked first with specified paths and NO_DEFAULT_PATH # and then again with no specified paths to search the default # locations. When an earlier FIND_* succeeds, subsequent FIND_*s # searching for the same item do nothing. if (NOT WIN32) find_package(PkgConfig) pkg_check_modules(PC_LIBVLC libvlc) set(LIBVLC_DEFINITIONS ${PC_LIBVLC_CFLAGS_OTHER}) endif (NOT WIN32) #Put here path to custom location #example: /home/user/vlc/include etc.. find_path(LIBVLC_INCLUDE_DIR vlc/vlc.h HINTS "$ENV{LIBVLC_INCLUDE_PATH}" PATHS "$ENV{LIB_DIR}/include" "$ENV{LIB_DIR}/include/vlc" "/usr/include" "/usr/include/vlc" "/usr/local/include" "/usr/local/include/vlc" #mingw c:/msys/local/include ) find_path(LIBVLC_INCLUDE_DIR PATHS "${CMAKE_INCLUDE_PATH}/vlc" NAMES vlc.h HINTS ${PC_LIBVLC_INCLUDEDIR} ${PC_LIBVLC_INCLUDE_DIRS}) #Put here path to custom location #example: /home/user/vlc/lib etc.. find_library(LIBVLC_LIBRARY NAMES vlc libvlc HINTS "$ENV{LIBVLC_LIBRARY_PATH}" ${PC_LIBVLC_LIBDIR} ${PC_LIBVLC_LIBRARY_DIRS} PATHS "$ENV{LIB_DIR}/lib" #mingw c:/msys/local/lib ) find_library(LIBVLC_LIBRARY NAMES vlc libvlc) find_library(LIBVLCCORE_LIBRARY NAMES vlccore libvlccore HINTS "$ENV{LIBVLC_LIBRARY_PATH}" ${PC_LIBVLC_LIBDIR} ${PC_LIBVLC_LIBRARY_DIRS} PATHS "$ENV{LIB_DIR}/lib" #mingw c:/msys/local/lib ) find_library(LIBVLCCORE_LIBRARY NAMES vlccore libvlccore) set(LIBVLC_VERSION ${PC_LIBVLC_VERSION}) if (NOT LIBVLC_VERSION) # TODO: implement means to detect version on windows (vlc --version && regex? ... ultimately we would get it from a header though...) endif (NOT LIBVLC_VERSION) if (LIBVLC_INCLUDE_DIR AND LIBVLC_LIBRARY AND LIBVLCCORE_LIBRARY) set(LIBVLC_FOUND TRUE) else (LIBVLC_INCLUDE_DIR AND LIBVLC_LIBRARY AND LIBVLCCORE_LIBRARY) message(STATUS "LIBVLC INCLUDE DIR: ${LIBVLC_INCLUDE_DIR}") message(STATUS "LIBVLC LIBRARY : ${LIBVLC_LIBRARY}") message(STATUS "LIBVLC CORE LIBRARY : ${LIBVLCCORE_LIBRARY}") endif (LIBVLC_INCLUDE_DIR AND LIBVLC_LIBRARY AND LIBVLCCORE_LIBRARY) if (LIBVLC_VERSION STRLESS "${LIBVLC_MIN_VERSION}") message(WARNING "LibVLC version not found: version searched: ${LIBVLC_MIN_VERSION}, found ${LIBVLC_VERSION}\nUnless you are on Windows this is bound to fail.") # TODO: only activate once version detection can be garunteed (which is currently not the case on windows) # set(LIBVLC_FOUND FALSE) endif (LIBVLC_VERSION STRLESS "${LIBVLC_MIN_VERSION}") if (LIBVLC_FOUND) if (NOT LIBVLC_FIND_QUIETLY) message(STATUS "Found LibVLC include-dir path: ${LIBVLC_INCLUDE_DIR}") message(STATUS "Found LibVLC library path:${LIBVLC_LIBRARY}") message(STATUS "Found LibVLCcore library path:${LIBVLCCORE_LIBRARY}") message(STATUS "Found LibVLC version: ${LIBVLC_VERSION} (searched for: ${LIBVLC_MIN_VERSION})") endif (NOT LIBVLC_FIND_QUIETLY) else (LIBVLC_FOUND) if (LIBVLC_FIND_REQUIRED) message(FATAL_ERROR "Could not find LibVLC") endif (LIBVLC_FIND_REQUIRED) endif (LIBVLC_FOUND) UDJ-Desktop-Client-0.6.4/cmake/modules/NSIS.template.in0000664000175000017500000005560512051252546022077 0ustar kurtiskurtis;UDJ installer script. ;Courtusy of the Tomahawk project (i.e. I shamelessly copied and pasted) ;www.tomahawk-player.com ;----------------------------------------------------------------------------- ; Some installer script options (comment-out options not required) ;----------------------------------------------------------------------------- ;!define OPTION_LICENSE_AGREEMENT !define OPTION_UAC_PLUGIN_ENHANCED !define OPTION_SECTION_SC_START_MENU !define OPTION_SECTION_SC_DESKTOP !define OPTION_SECTION_SC_QUICK_LAUNCH !define OPTION_FINISHPAGE !define OPTION_FINISHPAGE_LAUNCHER !define OPTION_FINISHPAGE_RELEASE_NOTES ;----------------------------------------------------------------------------- ; Some paths. ;----------------------------------------------------------------------------- !ifndef MING_PATH !define MING_PATH "/usr/i686-w64-mingw32/sys-root/mingw" !endif !define MING_BIN "${MING_PATH}/bin" !define MING_LIB "${MING_PATH}/lib" !define BUILD_PATH "@CMAKE_BINARY_DIR@" !define SOURCE_PATH "@CMAKE_SOURCE_DIR@" !define QT_DLL_PATH "${MING_BIN}" !define SQLITE_DLL_PATH "${MING_LIB}/qt4/plugins/sqldrivers" !define IMAGEFORMATS_DLL_PATH "${MING_LIB}/qt4/plugins/imageformats" ; We use official release plugins ; mingw32-vlc from obs misses a lot and has even broken ones probably !define VLC_PATH "${SOURCE_PATH}\admin\win\vlc\" ; SIC! ^ !define VLC_BIN "${VLC_PATH}" !define VLC_PLUGIN_PATH "${VLC_BIN}\plugins" !define NSI_PATH "${SOURCE_PATH}/admin/win/nsi" ;----------------------------------------------------------------------------- ; Installer version ;----------------------------------------------------------------------------- !define VER_MAJOR "@CPACK_PACKAGE_VERSION_MAJOR@" !define VER_MINOR "@CPACK_PACKAGE_VERSION_MINOR@" !define VER_BUILD "@CPACK_PACKAGE_VERSION_PATCH@" !define VERSION "@CPACK_PACKAGE_VERSION@" ;----------------------------------------------------------------------------- ; Installer build timestamp. ;----------------------------------------------------------------------------- !define /date BUILD_TIME "built on %Y/%m/%d at %I:%M %p" ;----------------------------------------------------------------------------- ; Initial installer setup and definitions. ;----------------------------------------------------------------------------- Name "@CPACK_NSIS_PACKAGE_NAME@" Caption "UDJ Installer" BrandingText "UDJ ${VERSION} -- ${BUILD_TIME}" OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" InstallDir "$PROGRAMFILES\@CPACK_PACKAGE_INSTALL_DIRECTORY@" InstallDirRegKey HKCU "Software\UDJ" "" InstType Standard InstType Full InstType Minimal CRCCheck On SetCompressor @CPACK_NSIS_COMPRESSOR@ RequestExecutionLevel user ;Now using the UAC plugin. ReserveFile NSIS.InstallOptions.ini ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll" @CPACK_NSIS_SECTION_SELECTED_VARS@ ;----------------------------------------------------------------------------- ; Include some required header files. ;----------------------------------------------------------------------------- !include LogicLib.nsh ;Used by APPDATA uninstaller. !include nsDialogs.nsh ;Used by APPDATA uninstaller. !include MUI2.nsh ;Used by APPDATA uninstaller. !include InstallOptions.nsh ;Required by MUI2 to support old MUI_INSTALLOPTIONS. !include Memento.nsh ;Remember user selections. !include WinVer.nsh ;Windows version detection. !include WordFunc.nsh ;Used by VersionCompare macro function. !include UAC.nsh ;Used by the UAC elevation to install as user or admin. ;----------------------------------------------------------------------------- ; Memento selections stored in registry. ;----------------------------------------------------------------------------- !define MEMENTO_REGISTRY_ROOT HKLM !define MEMENTO_REGISTRY_KEY Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ ;----------------------------------------------------------------------------- ; Modern User Interface (MUI) defintions and setup. ;----------------------------------------------------------------------------- !define MUI_ABORTWARNING !define MUI_ICON ${NSI_PATH}\installer.ico !define MUI_UNICON ${NSI_PATH}\installer.ico !define MUI_WELCOMEFINISHPAGE_BITMAP ${NSI_PATH}\welcome.png !define MUI_WELCOMEPAGE_TITLE "@CPACK_PACKAGE_NAME@ ${VERSION} Setup$\r$\nInstaller" !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation.$\r$\n$\r$\n$_CLICK" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP ${NSI_PATH}\page_header.jpg !define MUI_COMPONENTSPAGE_SMALLDESC !define MUI_FINISHPAGE_TITLE "@CPACK_PACKAGE_NAME@ Install Completed" !define MUI_FINISHPAGE_LINK "Click here to visit the @CPACK_PACKAGE_NAME@ website." !define MUI_FINISHPAGE_LINK_LOCATION "http://@UDJ_ORGANIZATION_DOMAIN@" !define MUI_FINISHPAGE_NOREBOOTSUPPORT !ifdef OPTION_FINISHPAGE_RELEASE_NOTES !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\NOTES.txt" !define MUI_FINISHPAGE_SHOWREADME_TEXT "Show release notes" !endif !ifdef OPTION_FINISHPAGE_LAUNCHER !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_FUNCTION "LaunchUDJ" !endif ;----------------------------------------------------------------------------- ; Page macros. ;----------------------------------------------------------------------------- !insertmacro MUI_PAGE_WELCOME !ifdef OPTION_LICENSE_AGREEMENT !insertmacro MUI_PAGE_LICENSE "LICENSE.txt" !endif Page custom PageReinstall PageLeaveReinstall !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !ifdef OPTION_FINISHPAGE !insertmacro MUI_PAGE_FINISH !endif !insertmacro MUI_UNPAGE_CONFIRM UninstPage custom un.UnPageUserAppData un.UnPageUserAppDataLeave !insertmacro MUI_UNPAGE_INSTFILES ;----------------------------------------------------------------------------- ; Other MUI macros. ;----------------------------------------------------------------------------- !insertmacro MUI_LANGUAGE "English" ############################################################################## # # # FINISH PAGE LAUNCHER FUNCTIONS # # # ############################################################################## Function LaunchUDJ ${UAC.CallFunctionAsUser} LaunchUDJAsUser FunctionEnd Function LaunchUDJAsUser Exec "$INSTDIR\UDJ.exe" FunctionEnd ############################################################################## # # # PROCESS HANDLING FUNCTIONS AND MACROS # # # ############################################################################## !macro CheckForProcess processName gotoWhenFound gotoWhenNotFound Processes::FindProcess ${processName} StrCmp $R0 "0" ${gotoWhenNotFound} ${gotoWhenFound} !macroend !macro ConfirmEndProcess processName MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Found ${processName} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?" \ IDYES process_${processName}_kill IDNO process_${processName}_ended process_${processName}_kill: DetailPrint "Killing ${processName} processes." Processes::KillProcess ${processName} Sleep 1500 StrCmp $R0 "1" process_${processName}_ended DetailPrint "Process to kill not found!" process_${processName}_ended: !macroend !macro CheckAndConfirmEndProcess processName !insertmacro CheckForProcess ${processName} 0 no_process_${processName}_to_end !insertmacro ConfirmEndProcess ${processName} no_process_${processName}_to_end: !macroend Function EnsureUDJShutdown !insertmacro CheckAndConfirmEndProcess "UDJ.exe" FunctionEnd ############################################################################## # # # RE-INSTALLER FUNCTIONS # # # ############################################################################## Function PageReinstall ReadRegStr $R0 HKLM "Software\UDJ" "" StrCmp $R0 "" 0 +2 Abort ;Detect version ReadRegDWORD $R0 HKLM "Software\UDJ" "VersionMajor" IntCmp $R0 ${VER_MAJOR} minor_check new_version older_version minor_check: ReadRegDWORD $R0 HKLM "Software\UDJ" "VersionMinor" IntCmp $R0 ${VER_MINOR} build_check new_version older_version build_check: ReadRegDWORD $R0 HKLM "Software\UDJ" "VersionBuild" IntCmp $R0 ${VER_BUILD} same_version new_version older_version new_version: !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 1" "Text" "An older version of UDJ is installed on your system. It is recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue." !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 2" "Text" "Uninstall before installing" !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 3" "Text" "Do not uninstall" !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install UDJ." StrCpy $R0 "1" Goto reinst_start older_version: !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 1" "Text" "A newer version of UDJ is already installed! It is not recommended that you install an older version. If you really want to install this older version, it is better to uninstall the current version first. Select the operation you want to perform and click Next to continue." !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 2" "Text" "Uninstall before installing" !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 3" "Text" "Do not uninstall" !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install UDJ." StrCpy $R0 "1" Goto reinst_start same_version: !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 1" "Text" "UDJ ${VERSION} is already installed.\r\nSelect the operation you want to perform and click Next to continue." !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 2" "Text" "Add/Reinstall components" !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 3" "Text" "Uninstall UDJ" !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose the maintenance option to perform." StrCpy $R0 "2" reinst_start: !insertmacro INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini" FunctionEnd Function PageLeaveReinstall !insertmacro INSTALLOPTIONS_READ $R1 "NSIS.InstallOptions.ini" "Field 2" "State" StrCmp $R0 "1" 0 +2 StrCmp $R1 "1" reinst_uninstall reinst_done StrCmp $R0 "2" 0 +3 StrCmp $R1 "1" reinst_done reinst_uninstall reinst_uninstall: ReadRegStr $R1 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "UninstallString" HideWindow ClearErrors ExecWait '$R1 _?=$INSTDIR' IfErrors no_remove_uninstaller IfFileExists "$INSTDIR\UDJ.exe" no_remove_uninstaller Delete $R1 RMDir $INSTDIR no_remove_uninstaller: StrCmp $R0 "2" 0 +3 UAC::Unload Quit BringToFront reinst_done: FunctionEnd ############################################################################## # # # INSTALLER SECTIONS # # # ############################################################################## Section "UDJ Player" SEC_UDJ_PLAYER SectionIn 1 2 3 RO SetDetailsPrint listonly SetDetailsPrint textonly DetailPrint "Installing UDJ Player essentials." SetDetailsPrint listonly SetOutPath "$INSTDIR" !ifdef INSTALL_PATH ;Main executable. File "${INSTALL_PATH}\bin\UDJ.exe" !endif !ifndef INSTALL_PATH ;Main executable. File "${BUILD_PATH}\src\UDJ.exe" !endif ;License & release notes. File "@CPACK_RESOURCE_FILE_LICENSE@" File /oname=NOTES.txt ${NSI_PATH}\RELEASE_NOTES.txt ;QT stuff: File "${QT_DLL_PATH}\QtCore4.dll" File "${QT_DLL_PATH}\QtGui4.dll" File "${QT_DLL_PATH}\QtNetwork4.dll" File "${QT_DLL_PATH}\QtSql4.dll" File "${QT_DLL_PATH}\QtXml4.dll" ;SQLite driver SetOutPath "$INSTDIR\sqldrivers" File "${SQLITE_DLL_PATH}\qsqlite4.dll" SetOutPath "$INSTDIR" ;Image plugins SetOutPath "$INSTDIR\imageformats" File "${IMAGEFORMATS_DLL_PATH}\qgif4.dll" File "${IMAGEFORMATS_DLL_PATH}\qjpeg4.dll" SetOutPath "$INSTDIR" ;Cygwin/c++ stuff ;File "${MING_BIN}\cygmad-0.dll" ;File "${MING_BIN}\libgcc_s_dw2-1.dll" ;File "${MING_BIN}\mingwm10.dll" File "${MING_BIN}\libgcc_s_sjlj-1.dll" File "${MING_BIN}\libstdc++-6.dll" ;Phonon stuff File "${MING_BIN}\libphonon.dll" SetOutPath "$INSTDIR\phonon_backend" File "${VLC_BIN}\phonon_backend\phonon_vlc.dll" SetOutPath "$INSTDIR" ;VLC File "${VLC_BIN}\libvlc.dll" File "${VLC_BIN}\libvlccore.dll" SetOutPath "$INSTDIR\plugins" File /r "${VLC_PLUGIN_PATH}\*.dll" SetOutPath "$INSTDIR" ; Other File "${MING_BIN}\libtag.dll" File "${MING_BIN}\libpng15-15.dll" File "${MING_BIN}\libjpeg-8.dll" File "${MING_BIN}\zlib1.dll" File "${MING_BIN}\libqtsparkle.dll" ; Jabber File "${MING_BIN}\libssl-8.dll" File "${MING_BIN}\libcrypto-8.dll" SectionEnd SectionGroup "Shortcuts" !ifdef OPTION_SECTION_SC_START_MENU ${MementoSection} "Start Menu Program Group" SEC_START_MENU SectionIn 1 2 SetDetailsPrint textonly DetailPrint "Adding shortcuts for the UDJ program group to the Start Menu." SetDetailsPrint listonly SetShellVarContext all RMDir /r "$SMPROGRAMS\UDJ" CreateDirectory "$SMPROGRAMS\UDJ" CreateShortCut "$SMPROGRAMS\UDJ\LICENSE.lnk" "$INSTDIR\LICENSE.txt" CreateShortCut "$SMPROGRAMS\UDJ\UDJ.lnk" "$INSTDIR\UDJ.exe" CreateShortCut "$SMPROGRAMS\UDJ\Release notes.lnk" "$INSTDIR\NOTES.txt" CreateShortCut "$SMPROGRAMS\UDJ\Uninstall.lnk" "$INSTDIR\uninstall.exe" SetShellVarContext current ${MementoSectionEnd} !endif !ifdef OPTION_SECTION_SC_DESKTOP ${MementoSection} "Desktop Shortcut" SEC_DESKTOP SectionIn 1 2 SetDetailsPrint textonly DetailPrint "Creating Desktop Shortcuts" SetDetailsPrint listonly CreateShortCut "$DESKTOP\UDJ.lnk" "$INSTDIR\UDJ.exe" ${MementoSectionEnd} !endif !ifdef OPTION_SECTION_SC_QUICK_LAUNCH ${MementoSection} "Quick Launch Shortcut" SEC_QUICK_LAUNCH SectionIn 1 2 SetDetailsPrint textonly DetailPrint "Creating Quick Launch Shortcut" SetDetailsPrint listonly CreateShortCut "$QUICKLAUNCH\UDJ.lnk" "$INSTDIR\UDJ.exe" ${MementoSectionEnd} !endif SectionGroupEnd ${MementoSectionDone} ; Installer section descriptions ;-------------------------------- !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SEC_UDJ_PLAYER} "UDJ player essentials." !insertmacro MUI_DESCRIPTION_TEXT ${SEC_START_MENU} "UDJ program group." !insertmacro MUI_DESCRIPTION_TEXT ${SEC_DESKTOP} "Desktop shortcut for UDJ." !insertmacro MUI_DESCRIPTION_TEXT ${SEC_QUICK_LAUNCH} "Quick Launch shortcut for UDJ." !insertmacro MUI_FUNCTION_DESCRIPTION_END Section -post ;Uninstaller file. SetDetailsPrint textonly DetailPrint "Writing Uninstaller" SetDetailsPrint listonly WriteUninstaller $INSTDIR\uninstall.exe ;Registry keys required for installer version handling and uninstaller. SetDetailsPrint textonly DetailPrint "Writing Installer Registry Keys" SetDetailsPrint listonly ;Version numbers used to detect existing installation version for comparisson. WriteRegStr HKLM "Software\UDJ" "" $INSTDIR WriteRegDWORD HKLM "Software\UDJ" "VersionMajor" "${VER_MAJOR}" WriteRegDWORD HKLM "Software\UDJ" "VersionMinor" "${VER_MINOR}" WriteRegDWORD HKLM "Software\UDJ" "VersionRevision" "${REVISION}" WriteRegDWORD HKLM "Software\UDJ" "VersionBuild" "${VER_BUILD}" ;Add or Remove Programs entry. WriteRegExpandStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "UninstallString" '"$INSTDIR\Uninstall.exe"' WriteRegExpandStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "InstallLocation" "$INSTDIR" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "DisplayName" "UDJ" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "Publisher" "UDJ-player.org" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "DisplayIcon" "$INSTDIR\Uninstall.exe,0" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "DisplayVersion" "${VERSION}" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "VersionMajor" "${VER_MAJOR}" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "VersionMinor" "${VER_MINOR}.${REVISION}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "URLInfoAbout" "http://UDJ-player.org/" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "HelpLink" "http://UDJ-player.org/" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "NoModify" "1" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "NoRepair" "1" ; Register UDJ:// protocol handler WriteRegStr HKCR "UDJ" "" "URL:UDJ Protocol" WriteRegStr HKCR "UDJ" "URL Protocol" "" WriteRegStr HKCR "UDJ\DefaultIcon" "" $INSTDIR\UDJ.exe,1 WriteRegStr HKCR "UDJ\shell" "" "open" WriteRegStr HKCR "UDJ\shell\open\command" "" '"$INSTDIR\UDJ.exe" "%1"' SetDetailsPrint textonly DetailPrint "Finsihed." SectionEnd ############################################################################## # # # UNINSTALLER SECTION # # # ############################################################################## Var UnPageUserAppDataDialog Var UnPageUserAppDataCheckbox Var UnPageUserAppDataCheckbox_State Var UnPageUserAppDataEditBox Function un.UnPageUserAppData !insertmacro MUI_HEADER_TEXT "Uninstall UDJ" "Remove UDJ's data folder from your computer." nsDialogs::Create /NOUNLOAD 1018 Pop $UnPageUserAppDataDialog ${If} $UnPageUserAppDataDialog == error Abort ${EndIf} ${NSD_CreateLabel} 0 0 100% 12u "Do you want to delete UDJ's data folder?" Pop $0 ${NSD_CreateText} 0 13u 100% 12u "$LOCALAPPDATA\UDJ" Pop $UnPageUserAppDataEditBox SendMessage $UnPageUserAppDataEditBox ${EM_SETREADONLY} 1 0 ${NSD_CreateLabel} 0 46u 100% 24u "Leave unchecked to keep the data folder for later use or check to delete the data folder." Pop $0 ${NSD_CreateCheckbox} 0 71u 100% 8u "Yes, delete this data folder." Pop $UnPageUserAppDataCheckbox nsDialogs::Show FunctionEnd Function un.UnPageUserAppDataLeave ${NSD_GetState} $UnPageUserAppDataCheckbox $UnPageUserAppDataCheckbox_State FunctionEnd Section Uninstall IfFileExists "$INSTDIR\UDJ.exe" UDJ_installed MessageBox MB_YESNO "It does not appear that UDJ is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?" IDYES UDJ_installed Abort "Uninstall aborted by user" UDJ_installed: ;Delete registry keys. DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" DeleteRegValue HKLM "Software\UDJ" "VersionBuild" DeleteRegValue HKLM "Software\UDJ" "VersionMajor" DeleteRegValue HKLM "Software\UDJ" "VersionMinor" DeleteRegValue HKLM "Software\UDJ" "VersionRevision" DeleteRegValue HKLM "Software\UDJ" "" DeleteRegKey HKLM "Software\UDJ" DeleteRegKey HKCR "UDJ" ;Start menu shortcuts. !ifdef OPTION_SECTION_SC_START_MENU SetShellVarContext all RMDir /r "$SMPROGRAMS\UDJ" SetShellVarContext current !endif ;Desktop shortcut. !ifdef OPTION_SECTION_SC_DESKTOP IfFileExists "$DESKTOP\UDJ.lnk" 0 +2 Delete "$DESKTOP\UDJ.lnk" !endif ;Quick Launch shortcut. !ifdef OPTION_SECTION_SC_QUICK_LAUNCH IfFileExists "$QUICKLAUNCH\UDJ.lnk" 0 +2 Delete "$QUICKLAUNCH\UDJ.lnk" !endif ;Remove all the Program Files. RMDir /r $INSTDIR ;Uninstall User Data if option is checked, otherwise skip. ${If} $UnPageUserAppDataCheckbox_State == ${BST_CHECKED} RMDir /r "$LOCALAPPDATA\UDJ" ${EndIf} SetDetailsPrint textonly DetailPrint "Finsihed." SectionEnd ############################################################################## # # # NSIS Installer Event Handler Functions # # # ############################################################################## Function .onInit !insertmacro INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini" ;Remove Quick Launch option from Windows 7, as no longer applicable - usually. ${IfNot} ${AtMostWinVista} SectionSetText ${SEC_QUICK_LAUNCH} "Quick Launch Shortcut (N/A)" SectionSetFlags ${SEC_QUICK_LAUNCH} ${SF_RO} SectionSetInstTypes ${SEC_QUICK_LAUNCH} 0 ${EndIf} ${MementoSectionRestore} UAC_Elevate: UAC::RunElevated StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user? StrCmp 0 $0 0 UAC_Err ; Error? StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper? Quit UAC_Err: MessageBox MB_ICONSTOP "Unable to elevate, error $0" Abort UAC_ElevationAborted: Abort UAC_Success: StrCmp 1 $3 +4 ;Admin? StrCmp 3 $1 0 UAC_ElevationAborted ;Try again? MessageBox MB_ICONSTOP "This installer requires admin access, try again" goto UAC_Elevate ;Prevent multiple instances. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "UDJInstaller") i .r1 ?e' Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running." Abort ;Use available InstallLocation when possible. This is useful in the uninstaller ;via re-install, which would otherwise use a default location - a bug. ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UDJ" "InstallLocation" StrCmp $R0 "" SkipSetInstDir StrCpy $INSTDIR $R0 SkipSetInstDir: ;Shutdown UDJ in case Add/Remove re-installer option used. Call EnsureUDJShutdown FunctionEnd Function .onInstSuccess ${MementoSectionSave} UAC::Unload ;Must call unload! FunctionEnd Function .onInstFailed UAC::Unload ;Must call unload! FunctionEnd ############################################################################## # # # NSIS Uninstaller Event Handler Functions # # # ############################################################################## Function un.onInit UAC_Elevate: UAC::RunElevated StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user? StrCmp 0 $0 0 UAC_Err ; Error? StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper? Quit UAC_Err: MessageBox MB_ICONSTOP "Unable to elevate, error $0" Abort UAC_ElevationAborted: Abort UAC_Success: StrCmp 1 $3 +4 ;Admin? StrCmp 3 $1 0 UAC_ElevationAborted ;Try again? MessageBox MB_ICONSTOP "This uninstaller requires admin access, try again" goto UAC_Elevate ;Prevent multiple instances. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "UDJUninstaller") i .r1 ?e' Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION "This uninstaller is already running." Abort FunctionEnd Function un.onUnInstSuccess UAC::Unload ;Must call unload! FunctionEnd Function un.onUnInstFailed UAC::Unload ;Must call unload! FunctionEnd UDJ-Desktop-Client-0.6.4/cmake/modules/AddAppIconMacro.cmake0000664000175000017500000001326212051252546023100 0ustar kurtiskurtisSET(WINDRES_EXECUTABLE ${CMAKE_RC_COMPILER}) # This macro is taken from kdelibs/cmake/modules/KDE4Macros.cmake. # # Copyright (c) 2006-2009 Alexander Neundorf, # Copyright (c) 2006, 2007, Laurent Montel, # Copyright (c) 2007 Matthias Kretz # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file [in KDE repositories]. # adds application icon to target source list # for detailed documentation see the top of FindKDE4Internal.cmake macro (KDE4_ADD_APP_ICON appsources pattern) set (_outfilename ${CMAKE_CURRENT_BINARY_DIR}/${appsources}) if (WIN32) if(NOT WINCE) find_program(PNG2ICO_EXECUTABLE NAMES png2ico) else(NOT WINCE) find_program(PNG2ICO_EXECUTABLE NAMES png2ico PATHS ${HOST_BINDIR} NO_DEFAULT_PATH ) endif(NOT WINCE) find_program(WINDRES_EXECUTABLE NAMES windres) if(MSVC) set(WINDRES_EXECUTABLE TRUE) endif(MSVC) if (PNG2ICO_EXECUTABLE AND WINDRES_EXECUTABLE) string(REPLACE "*" "(.*)" pattern_rx "${pattern}") file(GLOB files "${pattern}") foreach (it ${files}) string(REGEX REPLACE "${pattern_rx}" "\\1" fn "${it}") if (fn MATCHES ".*16.*" ) list (APPEND _icons ${it}) endif (fn MATCHES ".*16.*") if (fn MATCHES ".*32.*" ) list (APPEND _icons ${it}) endif (fn MATCHES ".*32.*") if (fn MATCHES ".*48.*" ) list (APPEND _icons ${it}) endif (fn MATCHES ".*48.*") if (fn MATCHES ".*64.*" ) list (APPEND _icons ${it}) endif (fn MATCHES ".*64.*") if (fn MATCHES ".*128.*" ) list (APPEND _icons ${it}) endif (fn MATCHES ".*128.*") endforeach (it) if (_icons) add_custom_command(OUTPUT ${_outfilename}.ico ${_outfilename}.rc COMMAND ${PNG2ICO_EXECUTABLE} ARGS --rcfile ${_outfilename}.rc ${_outfilename}.ico ${_icons} DEPENDS ${PNG2ICO_EXECUTABLE} ${_icons} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) if (MINGW) add_custom_command(OUTPUT ${_outfilename}_res.o COMMAND ${WINDRES_EXECUTABLE} ARGS -i ${_outfilename}.rc -o ${_outfilename}_res.o --include-dir=${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${WINDRES_EXECUTABLE} ${_outfilename}.rc WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) list(APPEND ${appsources} ${_outfilename}_res.o) else(MINGW) list(APPEND ${appsources} ${_outfilename}.rc) endif(MINGW) else(_icons) message(STATUS "Unable to find a related icon that matches pattern ${pattern} for variable ${appsources} - application will not have an application icon!") endif(_icons) else(PNG2ICO_EXECUTABLE AND WINDRES_EXECUTABLE) message(STATUS "Unable to find the png2ico or windres utilities - application will not have an application icon!") endif(PNG2ICO_EXECUTABLE AND WINDRES_EXECUTABLE) endif(WIN32) if (Q_WS_MAC) # first convert image to a tiff using the Mac OS X "sips" utility, # then use tiff2icns to convert to an icon find_program(SIPS_EXECUTABLE NAMES sips) find_program(TIFF2ICNS_EXECUTABLE NAMES tiff2icns) if (SIPS_EXECUTABLE AND TIFF2ICNS_EXECUTABLE) file(GLOB_RECURSE files "${pattern}") # we can only test for the 128-icon like that - we don't use patterns anymore foreach (it ${files}) if (it MATCHES ".*128.*" ) set (_icon ${it}) endif (it MATCHES ".*128.*") endforeach (it) if (_icon) # first, get the basename of our app icon add_custom_command(OUTPUT ${_outfilename}.icns ${outfilename}.tiff COMMAND ${SIPS_EXECUTABLE} -s format tiff ${_icon} --out ${outfilename}.tiff COMMAND ${TIFF2ICNS_EXECUTABLE} ${outfilename}.tiff ${_outfilename}.icns DEPENDS ${_icon} ) # This will register the icon into the bundle set(MACOSX_BUNDLE_ICON_FILE ${appsources}.icns) # Append the icns file to the sources list so it will be a dependency to the # main target list(APPEND ${appsources} ${_outfilename}.icns) # Install the icon into the Resources dir in the bundle set_source_files_properties(${_outfilename}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) else(_icon) # TODO - try to scale a non-128 icon...? Try to convert an SVG on the fly? message(STATUS "Unable to find an 128x128 icon that matches pattern ${pattern} for variable ${appsources} - application will not have an application icon!") endif(_icon) else(SIPS_EXECUTABLE AND TIFF2ICNS_EXECUTABLE) message(STATUS "Unable to find the sips and tiff2icns utilities - application will not have an application icon!") endif(SIPS_EXECUTABLE AND TIFF2ICNS_EXECUTABLE) endif(Q_WS_MAC) endmacro (KDE4_ADD_APP_ICON) UDJ-Desktop-Client-0.6.4/cmake/modules/FindPhononVLC.cmake0000664000175000017500000000145412051252546022563 0ustar kurtiskurtis# CMake module to search for the Phonon VLC plugin # Authors: Kurtis Nusbaum # # Copyright 2012 Kurtis Nusbaum. # LICENSE: GPLv2 # # If it's found it sets PHONON_VLC_FOUND to TRUE # and following variables are set: # PHONON_VLC_DLL # Please note this has only been tested on windows. Sorry. find_path(PHONON_VLC_DLL bin/phonon_backend/phonon_vlc.dll HINTS "$ENV{PHONON_VLC_ROOT_DIR}" ) if (PHONON_VLC_DLL) set(PHONON_VLC_FOUND TRUE) endif (PHONON_VLC_DLL) if (PHONON_VLC_FOUND) if (NOT PhononVLC_FIND_QUIETLY) message(STATUS "Found VLC DLL: ${PHONON_VLC_DLL}") endif (NOT PhononVLC_FIND_QUIETLY) else (PHONON_VLC_FOUND) if (PhononVLC_REQUIRED) message(FATAL_ERROR "Couldn't Phonon VLC") endif (PhononVLC_REQUIRED) endif (PHONON_VLC_FOUND) UDJ-Desktop-Client-0.6.4/icons/0000775000175000017500000000000012051252546015531 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/icons/udjlauncher512x512.png0000664000175000017500000010051712051252546021417 0ustar kurtiskurtisPNG  IHDRxsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyu?קLf&7$ Y^*U]W?]oPU1 $L!L2WGQ=黺gS~t=]B),!=*!D!R B BHB)@TB! B!Q@! *!D!R B BHB)@TB!,:0~5 !*E=[}58cPc`#p+b#"boxǣ*cE JB1KA xs>)81|0w MlDB4<ι_p. !cb7}(KkʩsV0/n`KB!Ġ,PL.iN+V[0vI!VO^Z w 0-.>H!B2 t=M*Bl&V @ϪB!$$ə5`f[RvC!ּ|7GReZ-3#ؕoSiBH~˝W}Tbڻ BS_VY.!*/QuWܨB!yKJ!C-jVBH>cM+]`T+$G!̉TB 5sZ AjX[B!5,EPV0B\r T`e5!2GL T+,!RpTʩ*T[x_B!ШSi(B!$Tʩ dVH!](:-%@!J9U1ŕ4Br:]N: !Bti>!R B j >HSS=S%omNv'On ߷9#ۜCH>c~,wnz y'f9$}&s.b A௬1tj09[B?}E&!Mg@Y Ս4^. (V?XB"*yaGn}w.ǛGB ð P}pzC/u.*G].8BBP)( y&`?s4be}=p7o!KBwɕ.b\@H 78sCuBav$$L_ﲫYEh !Y֮7Qtl7oI`@tH [g+l(ˣ&3V»t&noRkTiR/s^l `o;{1>0|1q;1q;,!C!aE:iPQYoy'&mnB¨ p9 ׁ?.H\2q *~mLیϒ+FC!K}^ls(:#!=px!PZɫށy EFHSj 4>/}9X;[EC3/F_~ _2坘veC#DT&(: מk]((܌ɵHH^bA?\Cɋ|[t8 ^8OEo0&~'":4BrZH^ai /= 03_Fc@saa|߀[l"$g yA{Qoa#~?]s`hPg,thfL1O*~}1W?H&!s?E%|0?]aJg`!H *R{QWij_$ &y&M@~ y,~ODߧB@lmPϪDCS+R =9ҧdbdd6ǜϜՇ{f~ Q3?އKEՏ?-[HQ@r<܇PtK2`XBIl&G5g$T(~QG@YHT<5HScC0LdM)g0h\ڏ*'2,a8kg+_r]O$8J3!:c:9l }^K flA3 0 ־Ut8ǂ~<0/MM]&YC QmpP:p5ȾҞOt0.3|7#":$Cv⑯s.v!T<58~ "T$:b,' 6VQЀj؋B >w}D#'zM񚄕㷋~eqc^GtͽwO<#:ñ܏o}\1Gs`S12mR0q8QhlN'P1>JJf'K I5B.NX" pH(.G5Qn&*~u@f&GQ Oj >ibDt(ep&d H%qDLS$},YKA}mGE@&FP;`?}@t(PwaF=*"QE3UMM(ƗL?} sIul H TE@BK=yEѡI9Os4;>X)1Gq10Y, 9~]F"d~=]iG1SS<$}c*~41':]{#'æ=to᪜֨ )<#+a12!|#'M-xmdyu@DW,# 'U0S c!:9JFoN.1Y;[ yDQ7PoHT$ rTr&6VKy?~ Eb#}t|E@Sq1+~W0a_$^m`TT? GnѡF2நɔY;:iG$'ڴ@5EҼIIWV9!H; hvH>pMt8`ԕ{iMA D-8*c(@IM P|iVz(Y>gMU;~ycH\—er0G?),ݨz.\ķ ;ݢ/ yj  6ѡVTzXvIz{J٬0'YXeȁdv T/V*U Sld6r㿟I{$a'kK} ?~$.?= χGg$+6iN0?<녓|nHCɹJA2DjwBOQ$엲5 ͠+ЙPK|M+ECZ_?6H\fy,)~)LK9zC L @E>K&Et8Du =y% (y*P(0T=pg[T/\;Ԧ3?#FGO)L31A}D7QT=p'4;PP@qTn !gb|ˏ,V+.My֟*GK( $s ?2;H,=mq3ߣ @Q=yŸ/)=I:/6']sLabh Z2( v@ @o1cCՂ&dn=cEZra?m8:?Eb@-iYl6/_v_2 ?I}dGZ p׀,t #}}|dsv1v'EBTD@s8Jts⮨@ҥ Md4 b Y! 20ۋߟ!( o{PJSC/ccinFy}}F_Jc.b *}1υ@#}}`<=\vѡPlWv n+CM)ŋSG2I\^ZQ J0jѐ X;N'_ , ˖]nϰH&~z;?{WH_%~RX0|_  {Pni-$ bdz(3pQ1ՅKZ!alڃmw`E8zŧ!wNrX'F<}0QVUb^ 5g_41":f4]' }x>ٜɑ\<{> (B&Mg_¥ ":8ϟߙ=ؑmO1wL VAZ %܉:ZD0fٰ`:]P{ -Mn~g i;'X;N`=JR=>a}LJhv'`z;`2 -oE5ӉW\z l6}j_i?8Pw7!~B2zqwfѡ xPR 0m i_V> 4x|MtYscUWt% ,<ofD~Կ3%}$%<CpJd4xQt!/}PPT,Ծ193E\XaVkLR8g ⊁` Sp!x'&D*1$3&}/?4Թ=>?JJiM &96A<-zzкw/zz'61]~;Bc|Rh Te\/=&:T64iڄfdM I]Rҽكy-KH^z =} 89boO ?dEFVj-B)|S}VcEk~ۇM$JuL"eSoq$Z ({Hc#c WDMssLS? ?&`lo9GשSh?zA:'D5]1S9 `n\* ?M\Ř &IhZ>$~ mB 8)ۇE )ֶSd%2WˣȈlƂ+:0wЂ Josklh@Ms3ĞGK^ Hqzk ! B.Y7ޢ>$[@-$9a}0Ԡnٲ?;}@̙uID-;1v&2;7qyUa{g!40 Ώ 0[@N1$0ѰjUlbb3/\LO@/S?!Q?WfTf#0-^'4kLۛO?468߻vXYHHI kRDwLeLOw0!46~5`1 ?ܙ>?:W6Kכ(0Ҳ:Xn$)ṄkրdGp6]Op~;$n {~-?B$ o,:,6[5 9sO'٨ȿ 9p\ǿBHǾL`x ~q_Tm?%[,R:4,ElFڵ:Y.~F@sdۋgΠlC$茥8{Uu?]|sGDu?o$89je.BH~a,*qk_t JKCCG~g@å8 !~8_0 Hp0V.^з?G=xSS}(B90 80.mC0EO 칤E`mG3>  O߈ Q1ijWFy].Wb?t_Tk6)ZNАfbW4E'ZSju'3/?WnGy!BI1vߌ%3?G0%BtyxqLn]t(cP?ߩ!杂E)3lO?s?szj ]N?!:<9w7+OA˯6\M ˤಌi!D49+OnQ@#.#d2"rzM=&s\<{B2ˣ ϨЈ}!k\ټy0ͱ =2(ct` !YƆ`Ga *4~8uျ2E{v HV0<!dV/aĨO\?tE@@uc f66ff0 Yaud):r؜NSu?zjcl@ycoo~AcppY\ Gq1 L Lf3L Ş ~?~?~?bjtt$$@l7%Q2ǾCQZSIBgqg:YQ^=+CJ(n<ᖅʆhgbBHqNʨP4> Øau8PTVE@B> x Q\ Qp!EEIj UMM$Ϙֽ a=0dwP* ƌybyf}$)zX?jEinBt8Yqj4^Ay4ɎlHzjPF`.#Y?2& zHq_pCϒPx1*d𓻢 ,ڰ={Ɖ?kP ӢH⪪? K6 E`W5QeCW\t(aʆT64`bhǏRg谈Ι;Nӆ@]P*5ŵ̼.wj }<CUSWD<x&&CSb+&T} V#1˱o(: 4d{YӢKT˰xNtBg^E1. ,q?-.TV܌5kprqL_mE5EeepsYR_u҂9'?a>*T`m= iXgPrTӿb?.t StlbW_驩д;ッytάAPZ[;l8\.,۸/ƙ0922װIam= %S4gD tV_TVt&su?190 ʘlFڵ_|N Lg]LOMmv5 tVY\U7ߌӧq1[Bf? @-9Ʀ=): $I##-mR6'prP?6lAkkg|]'OI d=1+V &`;~LJ!S(&u43Dl.%:ۏ"z&'11<1͆e7~VBOk+Bf2ɑ9GQVSeP1~Vas:r& uwu>MO.xyPR0fj->}4ۋ`2Or.y o!~1сu}11ۋ^qjT56\BIy}=|3Nكс%zg uZ5Q@I#>(: 3?ݠ$]&|%:Sаj[U_?$:XlP2ʰ?@eLEr&H&Ɯ±c8K`s<8KpXFS% +7mBEDGB|AsM{`i?.: ]%fYB??HprdӰr%^yeF<~Ռl ҂~,zŅcXzl4C@XڏMӢ@@-9`9:lljUؗ Y+'&_>KFpg3'+ѰrQ]B\2gnVMRV#y~gTOE2N]Ne^_~-;vԩ_xP ,t5- fOd<H}T44`5dmѣi;r>_K~DFD17Pq;NK1[`<)<LWcW㜣u>J*:y]>Ê믧)y 6% 9yX-6l 9FG~&pa7*Aصk$pb.n)dołC^2';5glE9''ZVnQq ePѲcb`XC]c$/YZCݠ`DEVir>. | M]w sܽEEFqrnӉe]QTDk 9Ɔ`;3)E I!x|=iX*ܿƛ+nW^WU4hilHtF@$A2UoϤ%UUXnvmGR@}mmh;zTq֡.!DN@D/IiN/Z2G/[l6,]Nh:yRqpCc:ԍ9*4Y, IQϧ+=aE/mܨ?|"ڎ("mN'mܨQDD+փSVF 0KEH~%I? Fק޽ED2uz^oy}=*5hA4H՞-*fItSetHx<?ٌE6߈s~Ղ&#׋ӯxE6dPcQ0Kt;/|Ԛ֮UlBѱ>\hiIDڵED XldT̒cH&/‰?jօ}V[TZn3ׇ _wq"~rjQcQ0 liW%)z1S eӎAٿ_y8ڕcXrE$ M٢`ge$)B?=-T܌b9'N31QDd<8q"6UUin("6d`L};r_NB @~X|>!E4׬Ig|] ĨKh-.'+<?4^ 0+nl0ưzzܴu+nںWP|Mye%++qMW3?ÝۭپgĉS8]]@P%I` ?./_.^LiMwmxq| _HX"| _ Ǐ}&,%SccH?ML;AOوȒGb!l;94Ԁ\1[PONW3[,?~=(>t;PoZQ_ժQ4D 40{TdI`TI=k@a #Om BWQLa ##Frޏ~Tt()ϟ~W`WW$z"9'l@TdI˗,ՙ&U@Vim(-Z څ7m7mvaѲeCIM7f K2 T](.;MӹήwΝh\Pt(k\ݹn,:}}yRuWTQ\aD$twl6U I~ЋvrT@!QHh2|t?>ۍj \q/iߟѱ$>#ux'u5&@o!:1d ,jIjrfȈn-|G J…ޣfv^Tx}_:FY0lSbД֦}Oa8-};1ĀL]icZB˰hAȂ4za`:Y }ݦ~ޏ~T7)08Fk ,0׆'ɕY~zjJZpݸ+_jWt13>驩ϧ}ctvN̂V=#:mwݥru0[W$EP o_JM#:_YS|ӢPG>i]\EPoNEPF_.C*UH8zh?C}(*P+}g>1:;*-7j^24͹JZXx1AKG@}bɌ9߯75 <[Fե0`O3lrxXh;lfLf3;DoowZ]>5B-ƣt 0D1l1['t{‘C@>@.+S \^5uuBcׯ^CtH$#Td*KcRnDv=]ИX9*2DT8nE[0$:Vg QUiL|~jln+_+VY~?|OX9*25@A+U<b nѿt\d CTU)A<;X^@ w w3cE$W2tE6@-7+w;PHk3;i MW{?d CJ@p`Ptf%aA2R>Ox$|"=:Vg QjP=o߁wՙ CTURł a׋ 핾 ` V"2;tvH@E/߁w@;DՙS߸JC݁^ѿt9\hH.pG1=״C*PeCU!SO@DY;5? IDAT\2GJ WtoPt~%cJқժa$z_D}X9*2m2t#.$ڻcA腢б:sTd 369! gOΞ:6a7[,:)O!:FQ!jV2)XH{ivIgW+}w>ѱ:sTd0&8'ˆJ{j0&:Vg LYrD>/#}==8~[;D$SXM2B@4x\Dpαg ŽgN=^* Q-b@ƣt /*+0~m[A9նmHW*NٝsL jU49:9 SlawY<_AKO8lN'nw}g~1:;TdFH__Kkk5$m_:<s$}P+}g>1:;TdKCQXnFHRׇ_<0T%$WwB@yɘFGzS>x1<8(: s׋)0$:Fg ,pإc썦9T8^a{ńF+H]!FP^5_tdt+4$=xaa?=0( 10^̝Q`y-ohH^pF(q`náݻqwcߺP Hg yނ̎繦ERdAm%iFTÈR >vѡYG{;>zJg$<F#}?R B@w5MɨjMsF(§x=q|=АPf(#l&KRl7Jk ͲaWc8^z]ε~P51>|8*: P3I}|!t,Q%v,y0f@.| ގx#%:e55:),+$ G@>_lFd\k+޿y!ؽ߼Y_gaJ[F>c&SdVб9{TdSihσr+`h#CCحz?z#JKQ1?1.?^tF 'd>OUDQ%jf2χ4^Q4 g>yV W_gt3?tOh1d(uo#5٣ K3ιIVjj2>_p!.+~u^uOѧb"c?)^u.]\OB…iQ.;ٜ;E 3z5Y7Us=MS spSp$}1W\S{h?{}swciVܴu+X1={^ھ/mߎG9W\vp(.uvj,Pb88j|,$yy6 ~&a9G|R{ .Itd:O|USzϞŰֆ眣a>͸nףvV=o**_ޙ[ow7؁O+7UM lz8 COjP Ȝc@ QsS~pMWLԳIlnGυ$IX31 4Hc3߁DI!Ģ@T g9:ZZnp1_g+eVvݦp]dRGH=/܍ ɳB,54$_al` 6Vm% pШP `KZ$Yg;@`+gG@K!fwEșҞH&\{$ aɵ׆涧9Ǚ4 J$)4Pi~?bG'B> ṦEQRpz!Ai)ANW$5^R :u>ɑ"'ݞv53cQ0KkD@r±cJMӚ5ɅSZS5kn3=5 ǎi~Y$B| QţcQ0KWP0Ço_=,v6AYДNns MVz``^H#<3[@ųJ ^yU.FRG.du84djuHDPw7.uth~?/u, ȫwtUu>Ůyмyz͛v)ۧQDnϸg)Z1xnyeFqzW+52JWXs{?=QTeu8 E.AOx>IksCT}с 횯5DDinFW*nw70C\1g)Н3cA_bJt *W@_$: '2DkEy}hXz "?1_B~䞦 5 E~B/x'&}&cݡi6P @Д{Nޭ8;@(]7˥~ppBڵKr0wS )|iWj y¯Hܡ G[D@46ى;2^ nE5$_/B$4Y [f]Ѳc Kl$]'q)б6w(#rrEA46ߏ7^|Qqd‚ka֌YYm-6l݊k*/HSpWV\'|fL^ ]9oD@Ƒgkln˅7܀57;C==8쳴OEeeS&z$#`jlLBܢ9x ̿%BqѰj[wUAUS*ގ'tqU VzŒG@h_~(rsǕqXv<0 !ϨR8hQJ ҉}#!t8~,؜Ό^CMs3j.@G:ȈʑjW1SS8g]7LOv?#9cƽsQ>D k*]cR 7:0#>e7fw PԄ& vu}} c(Aݲe?oۨӶ,˲;9}B&(Grt * e{Ba=v[h leJ+ !$@ vl'/Y|di<%[Hzޯ^3&y{͘v؈;'Ʉrj1~5 ; %/(߭$H3`BI_ ր*UU;0Cr@ڴ \(CIMM\s ;pȑ$G aX|/||٬nWu7¿;{. hQlo 1G sre!T54-QCLNJQZ[Нƀs>>>qmK` =f} s}PaEt(@:;_Һ:L={\rsuuZ::ݍO8m-8u:? 7^c8}f  ȫ PAwBnX$:Dyz6=#:b@-ALƤY[P0}k&ez{z>Bdl|-V8cÏGWލu_2b2j߰+hWOT?! %k@N7P@b✣!:1i,8ǚkvٽ'iq+8&)f2y?Ҡ?fI`!d,*t+ 1GѣpWTldUV*˸f.hklD Hbq:A;C5Ok ?- XDS{Sڛ`ZQRSҺ:k\zڔ.Cį$Ac(qe?@"@1::H9iWk\|f  r22 ׋?G#Dim-JjkaZ\<}}h=x-b ×6*ܵke?5~ddl]zcg#tCҮEB@w7څCv!PޕV]tx]鈝0LrWV 7CcABE@gK d\ȳV;?. @gS@b܂\^h(Qsxzz^g ՊS_\Ef?|w}Q3y`4$WWдw/_؞)~f3L $Isr LS#遧*Mjt? oH3yD ֈ#Q7IB` 0?ё 9@0Y1vp1 )ۄIrEnJPt8a6dL#p +wJ|`?>%+,Ąj@_E<|]FK`@^w(!ilbbCXdb* 75rO+&yu":@@V]^s !)&Θ6<~VynPxA.FХ` s͸RZ[;D?F0_5P |5`VɖjH!y͗n7Jjk%xuP.ugK |:(ߑ$eH%{g_!: Bm6L5+_] .9g4WX2SPbYW?rBHLLP3g,Z#Q 8Gˁ{HR TsB^s(!F́9{}QPc$'s#P @`5&: BLlh@aYfN0\?6;"8ݐW],: BM 55 7#S?g~>ɫ.?BP -vA )4 ӦEi?Z}u)7ۇ߯GcG E ] yy *-EFix|s#r@ ^2|aB%K LîĘۯ=׋%?$7LFVөHˆ\z'99|9VPVOSQuظw ס| MtZ+(|m j+`JܱSm;Wa;iq'|m@A0 AtfL_9 _S{;:vn2aP` o,6fZ_X ^ E޽TG)u# 'ρBaBt`ìիWXU~d2})>#՗BsDA0w0!Irag(:? å|àHB2J z5,v|yQUs~_y>t1RפW]K`? !d0u&`2c%8q̱OŒ z^`4_ !$cڲeJأ^':dțIF Iϼ\t18c,W~`-tVz'dA'M@AJ eNCݼy8sf8G%z"Gl~P_g'! 2bHTU&Id J%~Y@UDnDmš] ~#1{Zܨ00lxbaBF`аr%ܕe9vnTC>0xbeDAF@tAgq1fqC=3U~vop0'Y"OfE٧| `/\t$P9u**Oclx>W}ʁ~z*zn*D:z;O-i@W!JeP9]yWw4. P沌Cvw|<_0Hti$3(!$k9Q7~~qnd @UVK@TGvFO[>'L]e2$eR? w)bCŴid V밫zprkG=x/". (Q%?e:MϊaQ{)/*$з[<3-8 DGBHbbT-XմC=E@5zz'; ,Tr!)ԥKQRS`x|x#j:Z Ƹގ|}G7=u)>t !l|VTDjx'NC6?\|D@ (<f%>Vu t@ڶ }=6_z(8P@:3!(/:BRN~>GŴi0Û#cMKd@dBh؞=sZCz-Ε}_HMc~"~V\): Hׅ| \H1lj&~DkQtOeGAW:,vUwI{Td~xC梬e{#|)E"׋|4\ֻv&ew$ lqo_t0[pWTL+q` L 9Q8g^X"N~!mfHHPI&T4C__'d0{H+L-j:v !塰 QW}1CσM#7,s8|'j#l0Nd\tBt$$ါ9NPɏ*h*W.|hڻc?9#8F;d,Z(}v$ !$ N'a՜7ԾEV-Ylvt}Ko8id t; !cbC˅\NLc?:υf@D#G835 t* P$pc#7{wV @Y/tv_>Y|{8ozzr2m]!DGFw d g !$ 9u:a0V|QZ#@뵺 ~75eVså\gkqW]lσ?|# $qLd6+?-Pҍħ?5_?^뽈By6B wmcގ!3ZE`"y mY4H-k#7A@IL IXD—LD.r5"@9@3<;냧/itCinHғf(wy0[DF@|9 _LH-ߥT$,0_?V_] /fB*ёd{tGLhpQҚraS"Encψ!b I76-?[{5o@ɟ$Lhf+>GtD$Af9}AuTG0χ~x2떼cvC` ׈N|J]d5`/ADC z߰-y{Ϲ,;0L*EGBd|&TB8_$h} `~ 8yf(8uׁ]vWFF'bп 2~&3ؕ 4,RzDGDb> xzdnpߏGW8 &WIH_ 顗)$HkpHk5(P5/r @w7z;:ݍ~JL9C/Q'IEIrH<HzQ8#@5b?Pq`_Up!A40zH<dݺ?L`|"OWd@.P3n8@,CSH.Hl*ё E-D7l*~EB1Z eYz!ǀMCɟ /w)o[hrQ d/|{_ydH5N["&H_:bg{#"(،%PY':b4:S$#SY[ςU/$$!]`+6d )VlG^H&"d[{%"Dk`犎bBzEH8DCuXt'[ӔA.HvENZx7IĀtiIdL.n ?=C{DGDȸH uu1+R16y.L?/[~=C"$q.:.Đ dtΕ0? v0? 9Wҿ]bX:P'In! ?1 GI!E|J] ?'$LE`^+{1\ΗNA 俾x=Bb!$K mpQѷ=ަC w{xYT&`r.] p.99SNIQ\нuxϷvFLU fw)lUS\|r,EI2e nW؄DA:rHE!$aLwLɖ{[B@7_г zƴsa Ds8T0Gzл-to} =￁ ,8Ǽ̖$G:n~kcEHBιګ _IIF` w#SR٭EgK0a8%߳1U֣g`M؍)95< ɩ?  lJHiљ4}{dW`{Z^S'A/g Knr`Ƨuf{Nȃg4RDwm?1V;ҩCZF?M&{1kIUewNj4#BcaUan;??B޶ ̞ iYNlT!dʩ|a^=5;[q+~ѡh20W`-I^٠+I9?G'柈bp[ 2C $YK!v>Eg@w\9wZK0{>r16ECt(#UգW`@OG+ߵ>OTG?)G8Ei_y.X!$wKf'{_b'X%} r\O *X6>=}"}~"җcJ~?E1*~h~|.-IYd<lH i!I}>~~Cܮ&ʈ=ۑ۰pߔ6zw>`4ۀ; {+=U jYK-}ʩ v.{=hHXB#/%970 NOXeȟn߽'[_cU!\$qvtʩƼKMoƣovto\!]bғgx(<"ѡMn>kk`?٪|xQ5V2l R0!$edF?Ƙ5a8XwO~_x K]u |=ljl;xĊ/ _ !t*oxxCߞț(nq2N4烷\tPW~Ӄ-7WkL[XE-XyԇOHdd @D0n[m{kY cV3cدx{R Pqpx 4dr5J@蹻Lttd` {гa[P~n>|3{JK:`2%9Z xᡢ {> L&e`BI:!% LhQ _OQ4*bS;Q9#ҧm99˶?ғA~BCa ZD:|m-CO}%,KNkUN<)zw^:ZSIjstɩzM:wD6pYGN;@oWџdF#$%UYמ9<0i'Zp!$Itɩ n䁎F]r.ωB'ZfwFq@}/Xtb4iU0$C.-̹ fʸ)!d `4L2ʜۅZF.ыtb5 !DKZrsF%ŜAI3B %&. 8,ʇNSVY7V֊ 0l/=AzdćЁ^ۥcr.9KauQx:IA$BH-Ycr.8̜ɬ%Uȩ5v+G).L.Z": B1r:;&S^>8tR,9;$ N9,:3fpBHKu+>Pu `;D,]irqoł%r=%J.Շ-V r"򚄚 QcDKtaBC30;(fNk6&ns_1"}]~7$]tb4Pu^{}ަju=ӏ=7D=.Sb%9b-m9SdWMƴ{ !$W:]@P+dEw8T\?0Wo!"}_w/%BNܩ{?>Q|O)&M?{٘׽|M'"1qZ ҵЃt/v_[>f2)) WǷP͟욐td).G!`U*@X۴5̦|=,LqZ\f$!2}H= ,/T!D̔;W TKs*o݈{~ԮxI_R1껞DnlёB̙KU Aw nĄ _uxm¹(y).=PZ^t$bD2\O4S/\j83ha@?Fst=Nџ zHT\+7B 왝+oHR]T@Nwp[r|k$˳WOKlǁoS̚ = rG!dSwm_Tv xb?N1r*= 93Ry0WSeL'7 "蘳ӞDɟBFT& -0S ^%)=.~F]eӥ?nWp7`OkսB2@+i;Wv)/`ƕ`M5p> =[Qq7P%&ߠOՖ}[ܥ(nu^BAxٱTXH 65^BC]^GoAi?B8kZ8d%9=}zo :o"0;(5tcB ;W># Xqw `Ek 6{3`q.z*\KAތEiw>|.m|-7#}&GA|Ka8%g1{,(rBI[OX_)5 MҦX &I0>Y[`qgBH` -`HݰxB!DX_!f.zln( !Kv':C K!.3ڶBHp?`vx2DB!$˂ SuX -B!gpsO,:B!d~*ޑM! I4ɜBH:c$Cps/fBI.پ сPcs<@! %W5zҠ Ms<`X!qD*Bnn:J!Pt,Bv(IЋ\ B>_@A1i)8ej(+ @w!Aoqj_"ҾpsS; `=bBIs'ܵm_W'8ɨ M&(K  *6"B!is( e߾B-{Mnʃ?0?6IDATBZ| {}]ES(k B! IYB*!,D! BBHBBTB!Y B!$ Q@!d!*!,D! BBHBBTB!Yb*#VIENDB`UDJ-Desktop-Client-0.6.4/icons/udjlauncher.svg0000664000175000017500000002337012051252546020563 0ustar kurtiskurtis image/svg+xml UDJ-Desktop-Client-0.6.4/icons/udjlauncher.icns0000664000175000017500000050703212051252546020722 0ustar kurtiskurtisicnsis32owvwwvwo  //*)! *C8)&(*($E7#//'')% 24#6**5(()" #,&1221&)'&)&1771&((%)'-3PP4,)/&%((&/-%@.%'(')()E;$(!.,,(0-82%)+ ,,+,+,0/1#!&%%&&%%$'u|{{zyyz{{|ub|ywxxwy|bԟmnۙ%)ۚ{ )$ {/۟/% $n0ڪg ! Rb۬F  *[[ܭA  $]ܲU 996`ݰ 0j_਴D :HOిJ 7|ExLo84s  Mw~}}{zz{}}~wɆޮڨ/ 3ݢ &$ @ -& -A " iY  3y5Q  ,zk 99D~ 0{U F;\h[ F͠W`D"$@es8mkWW@@^^]]^^^^^^^^^^^^^^^^]]^^@@WWil32 U  \\WWX   XY #)*)" YZ ) *&*12-(('()* Z[ %)'=H=1+)('*$ /[\ $(+SQ3''(*# [])*XQ(%)(''()(*  \_)&HM%')%'..'%)()-^` (3I*')%7GFFG7%)(*+_a&(92&)$ 7""7  rĤ .00. % ŦF ):22:) 6#L ŧ  7A  ƨD   %'()  #*&.T^9#)()(''()(')#$ *('FW:$)(()'#',,'#')(*+" #*&4M@%)(()$,GQG,$)(()#*!(()=C+'(()$9WB/++/BW9$)(()*"*'-<3&(()$7W,$&&$,W7$)((**" ")'.3*'(('*W.&#(XX(#&.W*'()"*# !%)()+()#BF$#BB#$FB#)()$)#!"&()$N5&##&5N$)()&)#"$'('P/!@@!/P'(&)$$%'(&P0"99"0P&(&)$%&'()#L9''9L#)(&)%&'&)()$:N#(''(#N:$)(-+()%)%'($)( %R;"(++(";R%('+6/')$)%(*! #(#',W=$'$$'$=W,'(()&6>-')"!)&*+"!()&+PQ?77?QP+&)()&.G=( !")&+,#"&( )'$5FLLF5$')('GO2&)&!#)',- $#$()%#$$#%)($EZA&(($#$(' -.!%$'()(()'%GbN)'('$$%('!.."&%&(%*KdS,&)(&&%&((".0$('( '&(5P\K+&)(' (($01%)(,4ANN<'')( )%12&*)()-29?@:-%() ()&23'+**+*+*( *./.*&')((*+'34(,-,).,+.*+.)(''(*+,+,(46*0#,//,*(*,-.*67,-#%0..,+*)*+,./+88.(2./0-8T)2&(203(T4- 47 %7562-%%"%#"%##%#- ݡ֌  !48/!  >; @cJ C   EW? Dp & 0CB) p>r + $-/%r+l   Q    R% B^rŘTS%_`C1))1C`#?drd㫻,Ok{ ۲ۂ ٘׍ P P3ء3sˋˁˋ s͊ ̊ѽΉĴΉϜa4 4ả}( (}̈́ޛ(   (ρi    ifO !48/!  OٮM RcJ Sނ   EW? U߃   0CB) N߁  + $-/%5   !ހf     gނ&)Uxi""i߇$ y۫xS<22<:9764210.,*)(*'  '*+% II  ()()(&+8BDB@?><;:98631/-+)()(  *'(+ II  )()&(8GIGEDCA@@?<72.+*()  *'(* IJ  *(&2FNKJIHFGFB90+('(*  *((* JJ  )()&(?QPNMLKLKB4+'&'()  )'') JK  ))()%.KURQQPQPE4(&'())  -++-  KK  ')( )%7TWUUTTVL5'&()'     KK#)( %[Z\]`dA$()()'LL*( )%:YY[]`b<$)(* LM)( )%3VWY[^_8$)() (&&( MM#)( '+NUVX[^8$)()#+))+MM)( &DTSUW[;$)()*((*MM#)( )%8QORSY@$)()(()()#*((*MN)(',ILNPTH'()(%$$%$$%()()*((*NN#)(&=KJLOM,'())&$*5BLTWWTLB5*$&))()#*((*NO( &0GGIJN4%)()&$3J^konkhhknok^J3$&)(*(()OO*('=EEFJ@&()$/OgofVF;4114;FVfogO/$)(**(()OO%)('/ABCEE-'(%@dn`E/&$$%&&%$$&/E`nd@%()%*(()OO)('7??@D7&( )''MlhI+$&)(() &$+IhlM'')()*(()OO*(',;<=??+'('Rn`6#')()'#6`nR'(**(()OP$)('199:>4&(%On\.$)()$.\nO%()$)(()PP'()36799+'()$Dm^-%)())()%-^mD$)(')(()PQ )('+23473'()%3gf3$)(*+(%%(+*()$3fg3%)())(() QQ )(,0124-'(&VmC#)( )*(44(*)()#CmV&())(() QQ ")(+-.00)()%9k[( *%YڪY%*([k9%)()" )(() QQ %)()+,--()%Sm=$)(*#//#*()$=mS%)()% )(() QQ '()+*(&/f_)'()$22$)(')_f/&(' )(() QR ()$?nK$)()"")()$Kn?$)( )(() RR ()$Om:$)(+pp+()$:mO$)( )(() RS )('Yh0&()!!)(&0hY'()!)(()  SS )('*ab+'()#@@#)('+ba*'()!)(()  SS)(',d^)(*WW*()^d,'()!)(() SS)(',e](*]]*(]e,'() !)(() ST)('+c_)'(* MM *(')_c+'() ")(()!TT)()]e-'()&//&)('-e])()")(()!TT()%Uk5%)(++()%5kU%)(")(()!TU()$GoB$)()"@@")()$BoG$)(")(()!UU()%7lU%)(+ss+()%Ul7%)()(")(()!UV '()^h1&)(+zz+()&1h^)(*,+*('#)(()" VV %)()#FoL#)(*OO*()#LoF#)(-/-,+()%#)(()" VV!$)('-cg2%)( +FvvF+()%2gc-'()110/-()$#)(()#!VV!")()$DnV&( **!!**(&VnD$)('-6321.()"#)(()#!VW"!(YnI#)(*+,,+*()#InY('49644,'(!#)(()#"WW"'()&0ckD#(#Dkc0&)(',;:975)('#)(()#"WW"%()$7fkG%&)()&%Gkf7$)(&6?<;:2'(%#)(()#"WX# #)( )$8emS.#'))( ))'#.Sme8$)('+A@>=<,'()# $)(()$ #XX# !( )$2\ncE,$%'() ('%$,Ecn\2$)(&:FB@@8'(! $)(()$ #XX$!&()%)JgobK8,'%$$%',8KbogJ)%)(&0IFDCB.'(&! $)($!$XX$!$()'$2OeolcZRNNRZcloeO2$')('EKHFF<'($! $)($!$XY%"'()%$/AR`hkmmkh`RA/$%)( )%;PKJHG.'('"%(%"%YY%"%())&$%*058850*%$&))( )%2RONKL:&(%"%(%"%YZ&#())'&%&'))( )'*PTQONH)'(#%(%#&ZZ&#&()(MYTSPP2&)(&#%(%#&ZZ&#$(&K^WVSU=%($#%(%#&Z['$&( )(%IaZYVWH'(&$&(&$'[['$( )''Md]\XYO+'($&(&$'[[(%&( )&(Qe^]ZZS.&)(&%&(&%([[(%'( )%/Uc]][[W1%)('%&(&%([\)&( )'%:Z_[\Z[V3%)(&'('&)\\)&'()(%,F[ZXYXZS/%)('&'('&)\]*'( &(9QWUUVUYN-&)('('*]]*'(&(4GRRQSRTVD)')('('*]]*'('('&*4CMMLMOORP8%')('('('*]]+(')/9BGHHIJKMOD.%)(+]]+(*,06;?B DFFHKG5'')(+]^,)()*,.0369:;<=?@BCFC8*&()(),^^,)(+-.023578:;=?@>5*&()((),^_-*)()*,.013478::60)&'()*-__-*)( )*,.01332/*''()*-__ -+)(*+*)''()+- __ -+*+*+*('(*+- _` .+,.,+,.,++,+)()+,+. ``!.,-/*# #*/-,-/*# #*/-,+)()+,.!``!.,.++.,.++.,-+*(*+-,.!`a"/-.(*.--.)).-,+)()+,-/"ac"0-  -  -,*)()*,-0"cd#1.-1001-.-,*)()*,-.1#dd#1./  //  /.-,+*+,-.1#de$2/0,--,0/2$ea$1/0+-,+0/1$az"2/./../2"z#30/3223/03#7.102'(11'(201.7|$4104 40044014$|/22134144122/ 632 15- .512 15- -51236 4421364456312136434631244**6644343466**[%&,101,&%[ÀP>A@A>P`%%`22  ee %7FLK LF7% `ۥ ` aVۗ Va  u u zzbddb;;>ee>WW~~ !mXB- -BXm%iD"   "Di h4 4h B B }9   9} 6 6Q    Qt    tO  O,   "#!  ,GJ|  ),+(%$! |q   "141/,+)&%#"  q\ee   #8<85420//-(!  eT ]c  7B><;97871$  cV _o  .GFBB@>@?1  oU ]z  >MHHGEGF6   z[e  !KPMMLKO@   rO%)K_%  (SRQRPTP-   %R&G .VTUVV\I G il 1XTWYZ_=  l\ +WTWZ]b/ (D $SRVY^a) D1 s} NPRV[\"  }Q Z) CMNRUZ#  )X ao 4KIMPV(  oV _* #GEHJR/  *V `u  =@DA   1@KPPK@1   0W ` 88;=C  =[msqmjjmqsm[=  W `T  )567=.  DhsfN7''7NfshD  TW `!  00256  .cs^66^sc.  !W a|  !,-/4! Boi; ;ioB  |W aQ  '(*,- Ir]   ]rI QW a-  $$&*  DrW  WrD  -W a  !#%  4pZ  Zp4  X as     hf     fh  sX aS    Nq3     3qN SX a=   $nU B՞B Un$  =X a)    Kp*    *pK  )X b    f\    \f  X b  -r>    >r-  W b  Dq& \\  &qD  W b  Si    iS  |W cw  ^`  &&  `^  uW co  cZ AA  Zc  lW cl  dX GG Xd  iW ct  a\  44  \a  qW c|  Yd    dY  yX c  Mm   mM  X c  9s1  ((  1s9  X c  !nM aa  Mn!  Y d   Zh ii  hZ     Z d3  8s? 77  ?s8    3Z dI  bg -cc-  gb    IZ de  4rO    Or4    eZ d Rq;   ;qR  # Z d  bm3  3mb  '%#!  Z d@  !fm8  8mf!  -(&&  @Z dj "dpI Ipd"  0.,*(  j[ e Wsa5 5asW  %61/."  [ e<   =hr_?"  "?_rh=  ;7521  <[ et  DerobTICCITboreD  5?:77)  t[ e  0I^hnppnh^I0 &F?=:8  [ eU  "" IEB?@% U[ e  FLGDC:  [ eP ATLJGF P[ e >ZQOJL)  [ eW ;_USNP: W\ f AcYWRSE  \ fy  HeZYUTK  y\ f> MaYYVVP >\ f &U[VWTVN  \ f  7VTRTQUJ  \ f_   %GQMNONSC _\ fC   8IHGJIKN4 C\ f6  3AA@BDDIF# 6] g*  #19:9;=>AD4 *] g'  '-012467:=7 '^h3   #%'(*-.0373# 3@   #%'*-/+  @ekW   #%%   W~    ~3  3l   lI  I =   =&QURTC     C,! _'    '_Į% +()Q(     (QƮhnil tI-   -ItƮ)/+-nd\TLLT\dn ǯ  ů    ήʳ⮴BIDGʳ ʴϯb hdfʴ򳂴j ol n̴ݭ `7+8b `7+7a˴ҭʵҎ ڲɵڎİߴݺ`%%`22ee  1J^fe f^J1  # ӷ# ar ra  ޜ ݢ c݄c9''9<܊<^Ҽ^͓ϱ΁́ͱϳΫ̀ ΀ΫȇͨΨӇͥ!ίsV9& &9VsΥ҇ͣ ׶X+   +Xͣ҇͡ˆB     B҇͡Ο ۪V   VΟӇΝ ٥J   JϝӇΜ ްE   E͜ӇΚi   iϚӇϙޗ$     $ϐςԇϘf  fΎρԇϗܼ8   "#!  8ٰ͌\_πԇϖߢ  ),+(%$! ͊ ָԇϕ   "141/,+)&%#"  Ή xԇД߄   #8<85420//-(!  ψ nyՇГ  7B><;97871$  · o{ՇВ  .GFBB@>@?1  Ά myՇБޟ  >MHHGEGF6   τvԇАڵ  !KPMMLKO@   Ѓٖg06b|Շя.  (SRQRPTP-  .Ҁl2Շя[ .VTUVV\I [҇ю 1XTWYZ_=  ڵx҇э +WTWZ]b/ 4ԇҍX $SRVY^a) Xھ@ &ևҌޣ NPRV[\"  h tևҍ3 CMNRUZ#  3րq}ևҋ 4KIMPV( o{ևҋ5 #GEHJR/  5o|ևԊ  =@DA   1@KPPK@1       >r-  p~ه׆  Dq& \\  &qD  o~ه׆  Si    iS  o~ه׆  ^`  &&  `^  o~ه؆  cZ AA  Zc o~ه؆  dX GG Xd o~ه؆  a\  44  \a  o~ه؆  Yd    dY  o~ه؆  Mm   mM  p~هن  9s1  ((  1s9 pڇن  !nM aa  Mn!  qڇن&  Zh ii  hZ    &rڇه@  8s? 77  ?s8    @rڇڇ]  bg -cc-  gb   ]sۇڇ  4rO    Or4   sۇڇ Rq;   ;qR  #  sۇڇ$  bm3  3mb  '%#!  $sۇڈQ  !fm8  8mf!  -(&& Qsۇۈ "dpI Ipd"  0.,*( sۇۈ Wsa5 5asW  %61/."  sۇۉJ   =hr_?"  "?_rh=  ;7521 Jsۇۉ  DerobTICCITboreD  5?:77) sۇ܉  0I^hnppnh^I0 &F?=:8  t܇܊l  "" IEB?@% lt܇܊  FLGDC:  t܇܋e ATLJGF et܇܋ >ZQOJL)  t܇݌n ;_USNP: nۀ t݇݌% AcYWRSE  %݀ t݇ݍ  HeZYUTK ہ t݇ݎM MaYYVVP M܂ t݇ݎ &U[VWTVN  ܂ t݇ޏ  7VTRTQUJ  ܃ u݇ސy   %GQMNONSC yۄ u݇ޑT   8IHGJIKN4 Tޅ u݇ޑC  3AA@BDDIF# Cޅ u݇ߒ4  #19:9;=>AD4 4ކ uއߓ1  '-012467:=7 1݇ wއߔ@   #%'(*-.0373# @݈ އߕP   #%'*-/+  P݊ހއߖm   #%%   mލއ    ߎ߂߇>  >߇     ݚ߇Z   Zߛ߇ ײײL   Lޝ&hlikS     S,%*')w/    /w0 734e0  0eߢ߀ Ó[6   6[4<7:~tj^^jt~  ߁% "T]WZ |     yE6F| zE6F{t8mk@  'sӸs' QQhhHH~~ AA{{{{AA ~~HHhhQQ 'sӸs'  ic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2d#Creator: JasPer Version 1.900.1R \@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP ߂?P>fS&+:aԑcaf1C"&yD [I DJ>b_߂8z3zw::idWbi[Fi\YnvW7OOR.\3# ;IG ߂82 #q6d njQapF^>LNȪϛdv#j_ezmQTX2K߂-`("9wo!'7>bd$إY$Jp/o0H{*(zW~1 ;[7 NVw,#o k@g5OZ$Îrp&BH6y̵ΈmԜ nx)p~/ sa6?6_cnmfnPDZhJ$96oI)SUC~Q![wO"n) ! AoH̤ۢœ"*#û`_"lY+grlLNwZS'_CA! ;"3ܳs4m1MrZ5+q:[;UqTs2KW~q"2S}Gcƛwm 3کQ/Y'_U4ž4TinN1q'hQM]DɶV͏`&$FL6>"Ř p_qdpy_wz(-oKëqS=9JW*ū4|-pTrO{FlV%n]of~ $ LPٓ~`!T^ǰ Mh$ߗa>\HK,I94u9q(Ae霡 o K<N#0n ן6os@s1V16 (/~7\}}z涒gmcؠVo"u]ߝ? Z? ()1P/̍OoVt`cm;YhU12f/`zz^2n&T`E(zSط"X~ e^*yקK;)ԐJ]C2%/ǜhPRc =XԿJԉz: [֐ژ%w"$0Ƥٮ"]V[ڔ|KZO4 ax1RJi4Dlx̷TE`6S>YVVŹT6ǣ t1䖌b[A烃F-k՝tRXqY0ބj*56d>KsѩFαcǧ%&ϒcdV^`k> @p4!Ym>;Oa@]E;\e$jZ~|rc|l7ԱUXɠ/(; /m2zXJkw1_!k 48ga30`of@Ýx-/_r7G5X8NоCщvA憿ߚ-F`UvI~ty2Ȟ*~$ȄCw{f1[&GJDah  uĽl~w08L̺W*p\ѷaO6!N X #kZ/[i-W@q_ٞb~Ygn'kh_ EAsruM'~p?~8F3Og \⼎p￙m Rن]`;ap;OGÇ \!fBY=#9.?ᏽQiQj|Ɛ VvL/L0OQdd7֔řڂ 8w3քFt~j&b^Xu>{ǷbXTt ^XfGهMI٢8;I)j;lLM{*9&Yj4JGy,Ur)5~E؜Цo8FM*H⪦*a%݁A]s`sPjKÀ3YuT,=PH+n)0yyY0Wfp M?R=cPcѮRv+evKbu>OڑU0:-)e Ta\x'MznQۄ.3{2脚n,XŃ`o;–x+Cm||ҽ4W}@$Ex>+P^ RعvT\.ajmaaF ö.\ϼ4J\ `̺0Ȑ5O 7 ֛t]ù{Xa>J$羣8>85{{'-˽C64@/D$CY~/ ۚ93S{(@@9ɚ/"q藌{/)Ǩha S]_V657KI}}T''d"^tLJĆS!o 5JXQ11F og@-e{h *TH(S̼: Dΰ^pAV@2tKˀ|:eRz["[AUA/w4[ƒiB9CQGR0Bf!m'2휔+Z+'Glъ#C+CGRU`.Rg?Z0@!LܤZw 4(9v!0;7;]0,S?-=PhsiH 6UF.dpgl[gkKYh ͹%:_Q΢2'^JIc N N!p\dsSU)c̟gâtYY7E\5񸟶)Lӝe׀V氀1ӌ=+\c{6xTčԾŝG=jqSZj[?pX|=vEJځcA W>jF^]zkkc<xF(Th"KTr_o; )⤠^&O[f[u4'N*N"*XjR\} nB4b ;xmq36c3K3~ IRVq@ʹoI\,[ް/͖d Zt[LqS~:yYklˎȠ&洅8ϕo{2CMir` |"K0_6C)/4/Ea}7rKk8Ui(@g Ƿ~ڜzFq~Q3:I :7>t呴M M?R=b䠆l9/zYwdEK@ U)jQĤ8wi^< %2"]iq"[i> 6Py$ ec~F}Dzہ> I' 3?J8. ui/T&*A)zdZ_zBJ+SdOP~GR V%nI$J;u?_YM`DpS0HNxF[ w4 >)edV!A$I*-ط˕S3oKj.^zb|5 }^b,gBٌ&o␖.<.ͻYDsExZJs(;#Yʓ.>Ӣ~5pkz}c=c.d^ie)w> #JL4aKeEѡ>~(`gs5!/r5ܧ}5W&.z";Fc0ܳ"~FS^)k=ڵ V4G^([3^7H\_*_ߟFs? d{{^3ayr\AIym[WXE0Vf*}ο Wd`Ce;<ꈢ&g Š- -$YE$J ˸*0O6]rw  <ߨqO8{!grGAxwxȖ*cG\/fz8.?S#%[Z,: )IXWC^- (ZW'H(q`XV9s\ T=҅ɼա,PVB8Thȗk#TO>:܃t\l`6zո'zrŋ7upxpź#/zyi#k?.8dáf]^TڠAȝ)AsO;x/xjh`[++ĕ@t,kVߋ0 PhhAC)ykcɩcYHQ; nuzy`EK(}#A>nXlI| -oiI>hei먰F='/ M?R=b䠆l9x D_w+(+sejH$ٰ(28-T!B({G?Pѝ|;J% |e.eX*2KfE8&zQċ#{3Ϲx~5'R-2Pd{s݌| 9^ fdTSgJ(}x͊cbqh7+=Ȁ4\Xp/UWHȯtAsW`%ϸ)<س6:.Jwu_!=nU? G6rI$I6٫\czfq`3XK\OoQ,w,}&( 7ޒ;PotBN9r߰I$I$tH2KoUl2طL)Tף[Iiӂmo>qn,wʘ jY㓑j}",ۺbIhndÔGZ57X-$I$FP~ 4 !]d^2.fdEUGu[DGN_z~h,O-L{vɜM PC,W;ʼn XD7ecH6\bvKY1"ě<%K`[ Wg waI5d}AtSKec1n\Rh9HkPKp|q輋>|!PW= _܏=T߱Ήc*mD%wQ8K*lmؕܦn^mCg~a8l lD|H9XBI9ŝa[8%뻺rkTsg>c>ݺ'j55{[ yɤNE0uŰaZbjׅG&v] ik:Lx`Un* BâK>D]L?{ro][l)zS϶W\Oܡq< :j \ulvhY 30 E>I`JMj ײD_erBL9%њ/c5To4mh) {m1‘  1"ʹ0sB>[y"p*$xd؃KbaEm-H2kfj< %u߰ -h^/^=Rk8(ܒdЕ3-^y=p)`:H~̺Q΅(ZQS;IR#45ŅRg$Z*n$zr.^cI1G̈́'j-e#xp;SR@ឹ{=*tD iq`vbԸJ1]).L. q]Cix{_{*zY,EȮ;4m㔴~∹0RБ+b6ԩ;= 4!56w6@)${W71 S7Di^iumP j\.԰9K!J=gG\xQ&y:P!2ye]Me—mvԫ;'EH$K$Ah`>>%G*&YNox5i#s3]h8!b{RWSz^Ao2}Q;Ơ?zBy 4w- oupx  9wTaDL,CPin>%dCk0qNh$A-/]^E.{ ċþőU B(bvGn?J.03u}H=Fa'`WmnEmP]ʰo;G&"#X`c\W̻ZwF$-XdE{@\E{v|&A٢OGׇlf>A2}4fs)R||R?h֝Rkz_O=U8jq+JOE̦ \:22:lunq"3y=Z `6\sqj|Wc~P@W*>v4M45 h>{|n>%rƙbRF- M )1| D3[TOZ^߼)AƸt4?HJB˔˂ rogu!|nˌk{?y!m9o& />raGYiEu/j6~%2?fXnڡ$ug2(I2#j5XRҕUMiz4g2m^2ds4$D=,$aP=PR'UH-Rx>h<"l/ot4dEDMz 1*/o C%R|)ImLvYY% Z uCEPP*n0|RP@tg.eRl_"CVz0GzM0sU:="~Jxjf #'i &ў"k~ tUJ0Zq|t0=S_ap :%yD+>-H&5KYvŮWMd/ƥN(,C·NܼMl}bBR}R2{3XlvA\?*wRdLv<1,:Lݽ48eTSDLcA7GǕZYmP1\|-ŋt bҿDRr@Kܡ4y{oQb0F>3i~5rRficy7A1hn"yFQ+Ի3܁݉A'2d!ܒݹpBtkxPtT-(o`WW'3)b5Rv_?ݶ0iݬO"uq&NQrtR *^4P4/X pX2:bb{Dn?/]{XCmi+۟&Ln 4@@{A!_ egvSd^Y)hP#/t>\KXvG>#i&Λ`g,N`b9R}3K`t []2?f_8޺C >|cC?q vW*bQ_(b!%> FyNoF<;^Ş7< 4(ıxɽ-+9.~1+d*b`U#j!XrVa5 ) b;|?oF9)R. iŽ`svƥSkmPpׂi5:>65=%M:方"fn|`D{u]QKjٺOPE帎:fS7cĖul _~z O\a4qjȬX5i}4c;t)T7HF'9%2&a|eqؒo tsJՖU\Θ:D8aB-} 漘XǶh-V圼޺y/c*^H¤Ӊ S6_NƝ :DNҳN# `Ȗu6#ע,&^`xHıuw[S /PEIXc7:` I kCHWym+ּL +97?&FNDp~W!3{0hNǜ N\rVZF6ހnxWM|mZ1!\{ &`KέT ;/nJz4<mzzō)%ws~OsS_ߘ>42 9HL8 ߎc >o.3#,r-cEWʳbRo<;#`cec!.,?_ Juv, b:A+I2BՉ~b(Dì%tz\H2ގ5uЕЋRn5|H$igFS)#Fem]Oix^vs""(TQAz͹ ˟K C"zuùSfb>ïzaffٳwXPƯ0eȉ=[5kbȧ\R;3qmY756ҽ/ eNa|߹{-hJ,| rا2BnDYMYD~eט6ӽTDwj ?n t~6ɫD&n/+O3@r4xf˛ZEM 1-/͉`ii{mTL"p*av,2ny u*fcTu\kuh=Zv%adE*cI3:p7`zW[g%oCXn<6|/X Cv^bz@L[&X0Bef `g38XKRD?~2;p yM솧\$tLqD^uK+ }7l$z ~2@a TEnY0|\KMj2"sikԝ#+ݍFƁcl(Nczݞt_h3ɝ{pHOPm#goU}giUKaPS}k!PDTƷOZtBP&Da았TrR(cB"եUj&Gk߱\X!lJɩ9?4rxfGۉxF hW&8]׃ AރAa8;,gFMpe*ϺʓUOCڳq?nIxpjBHrI5ӢRS7ad&_aZ1kʳ2V=wus9U|暠O-$gTigHV- Dg"<쭪yX+&yiĔUZy1 $I$I$I$I$I, TjzNy[a~׏q,z& >.dODcUg~Xw϶vS'bBVbj%#2/*+‹j䊝I4JNȢ{w4v\xpa8SP:A‘o9Ql@*wT"T5iAmlpnh(eM_m†*&zeKZis"we2U70 I߸c I6f$qIs3>Mn `j)8PG1ip@Q(|@6'~΁!=S}iatn>O,TGo30t\yoW :lp,! zqhQXYwFx-Y6duŏ$~!ZQU~HOy"{Tz@`pLg'uȞppBl`mnXvrLt=p7HD<-4jwR2f;DSvh dm/^Ǿ( Fwx&; |*)`voa͗ߪmعI?Lxغj3gGZSkH'8I^6(љ'aSy;+xhW\c'镖:6n``~b^LeK2ENT̏)L)ŗ֊2"W at77R'Tfh;4 )"۬FzXʢ 3Cаz﷗Ȏ9LO>0vlUȪe0ꪜF;;O"V%t[GCZ|T793JVc {Y^Ó/⦬V!c(AV~9L"b(PJ|Oo =?dJu7ɚҽjކ^#^dKpíc8VeffI̖erxY)[s^S#hJ܂cF!EamhV&$Ck0S~ys06~1z p5ȃ?)wmqRs]ލ4H`rKf xkŅ,?i>l63CW-+FӺGӓIN@F{fyS RAq%E鋗sf e{#=|ub$UѬJ38hXKi liz&ʽ9uO+›T4OU*F@78&6'MlWZje]'AYt :Y$ysgmS$2purK6egZSqu/tA#?1w>/+'{zZ na2ؓ~z%j[eA3m9H|.Dn "*ǣqft:(!<<7BEڴ7=C~~lkK;f&Ϧ=b4'+^L^Tʉ,, GxLYnc8,X5AJ>y~V]x=yWAT!1# l0+6`&1H}Ug:.T^6֮0i1 ~$Z<nk)fbDOoתP?l:ñ$(#slӎIDT2\4EaZͻ"`8Yj lgl%JAnE-r{Gpπ˾A{5,9̜=ZJ=wIC" [ۤ,%:"-9Yi,&D̬hEz=:Cqś&@ˈ̀W5 J۶6UNL,C6tJx7HJvz8T hUA>2H!)}R4S6 Wx'gZ-4X"fܐFnXeks90ld_ &K0UJ3 믑BZg^ѬoQT>"pd3th+%_ғhl;91UBUR&+nZM!iw7PfJ_ Ӑ,zDF1f2bMT! ඟD0=Yc̙m-i/Lw"ߊxh_;ɑZYz>i:cfiYϗ& 5dѝ"6-/KD/T TȟÛ^ۡ Zr,B~=Nyz/O9fFڞbc]*( 榷ZBg_ 6ho9Z- btɚW~P+``Zk[& y|4.@J x4-lSNZ  m r|3=YPE`7X+]yR3lYV. Ɩ/b4mEol8#|VQ%b$5RJWBLD6A_y '4r>>|)Upڦgy@C嶣 K̤ar6➸7$k[>̄˰o?[.mkkbW4(هBCxd/}Z" )K\ᤵnlPZBZ|I&L?f]iECW*dЭ?COxNݬ(wR6Xj ̧5k*4MהG'V1I38N?+OXФgj٤"UH ɓհNEH`5e+Bw#и̕^'4KOf̩D%>4sRv ϳp1.p{_xIG y$";jR;_u-5/2,-^ Ta5LO.|G0 bHzKӌѵ|ACnӯ^P1u^*fFr˷dUS#ZnGIcFӒ O tvq)F  7BDq7t[ lk.lx1mi b$Ս4kb(xOox)a4ҫ7<>f M߲qp9x5h 31a??"-5#ӓN( N}8K$w(CSf*6y"Jq4SW2Y7b)wJZq/9Y%Pq]s N K+O|fXյLĠ y\\z\sjT>.O<]X~7N#`/# eKyQΫ2FڝDW{ )%sk{e&CoaT}vsp/cl*V qA̮ eYV@_b@m)+:6$H6O4J1!H,?Z"vm=[ ?v T]>:+U#,5օ z'9{pkq&Ns N2 peCKoa44`^d6:ftKlOm`m `/P+l?'oKuJ-%$}y5F q3zg3.?'6tYk gCB9PJn0]m撬nR̜|X%ș+L;7+ޟ4󢄢_!u8aZ}|HJ yPXQ9q;3$N&GH{|~ !RàS92;Ip$7 ߏ1>`aMfFf[+B;( GFm; )x^m}}jS\Te̻jXWroN-~at>6^7ܚ;DR.OU뗥&9y%HGY|Wu:`XxluiJtiXE=`*m([T"pm;O^rC|2+<IkTBlʑ7s LLXp3)ELj.)JyLѿ+rRX ls n]$٢gu|O@zQGƁR]5Fʾ$RlxSV㺲ɓ2By;Glt_ rk,gO/X;@;(X˟)7䲘S]y_&m12.&1gjXPyR@ C#C\@ۗAڿh /SxTǮ'-hmU"kbmm40Yk&5]_q48',y'(@^ngߠpDl١ojg/C-J<C%QS8KPʫym HP.(cs7Eda/uCkP~a?eWy(͌mHh3N 3t 179t6^)IY * e.Rh%5֗n|D9K77Իzq,T:hc;# u+H3ۦ,/VHVasa)kDC`8x8&}{F*D^P{Ƒ dMB16PU%+=gü,* WO6Ԣ_촔aN$I0o }B½ w zEH-0.uf4Tx92INdgHNTP;:jCWs ?MOi 'SD/ю>ɰ]5*ȣ !9.+AL9dO"5b%* Zqasy#>g_!aw~G"lMua~{-:sȕ!Q\ZjA \I(V&HP X|XR,V/a1&G {gM^X._: vh|Zg6w7I 5jj~dayWZ?M䯹Jؓ]L (@XwUOĉMAпDI;vo3H).]mW6Iۏ P42$`` q{RsG5 , G<U]t3<Ug^ku(1v͵p7E~d1ʳ3ه+gZ9b_CDY{K]-"G *a@}u.dGʢ>1F=xX5Pa˼f)@ZSJmI]h _X`T.VKŹ0wV9qTَPJ_fV DVt q2jy᥈a: (33@L~)_o1k4hIe:^E?˾5OP ^ j/Q9u2R3\W"e w*'f4oM`=٦g`<9. Jˆǽ oUMqGZv8F8ZX.ErjZ@:ozvPD]O@AV ܊f#ۋR?" C2~1ng} 6+OM9koPUԤEVϧހu -B} $#B ?l$wP?zc%LDn7]en{Y8TOoMˈ:˒A(賋 x$ķp>gV_Z%)Xj^QL2( 9e&/ˋbK-(Cbt鄍B kʜ]r!o/Gx8MGWV^kʃëAq/%{z*{E_vtʀD^f\` ڗC^?Wq7C-Ȥm67B"Y4z.cd_0B+vscnиѽ=Ma!G(`0V "T^7T+H$ԎOT $yU"2W/hߑ_wfwPljFmȳ<80F4j#j:7\0,կ'oecGſ]' ')QF܉evVtxW>@O!>鷧O8{k%Lܪ o&x؏dCi`> /04 :M+X$m{.ڞ9NeNK4HJU5IRkY55̆X33 }l'];{&&LmߑaC5J#j~#םB2q)3(``10l/k;GZw|gmBw Ri/_7"_L6xB(EPke oap'Cw DËqͲ~_G倈왗P{S:$5DB8cHSv2{!ɧHHm@sZ `{v< ke<86ueI>cI  t9Ì1^ƫEc.2i4ثzrTf.ix J_31}LJ;|H׳Jjtwd֙jݛZyʲv }$rU5hϢoO 4WظgII36/4K- ⺅ӇBᚐ4HQQvv?:jǍI?«kfCc>)T%tLFǶ:U2`zlt= trj|y]3~¸HeքPh1cLv3j%ηn,U^n 4U8R 0BRF$͔+ GSaVghf F$)\(xАspp%7ԶWC?zpXWc%?lvl:yPrS/N7X?8 FJd| k͕}؁?+Gyd nzXcqT4oߤ$5wr]ԿsN ` .,z}U+e4Pkf nBFi~O5 L~FJ wWFm3(8þu>t}QBΫP!.Aƒd8mC~OiQrRMw̽K>+rC[ibSHf8'`cPHV2b.$=_cIq'tϺ6gQ<֗Ŀhڶ_iH62Z:hd9١XF1V< b^wouy<6Ȧ"(~rg UIPnY8z&1bAf0#yt%/~go֏:6 =mA Kdgb $Ʃԙn_/3sI M5-mf["Vt賁bbm)pA7BzoާoL~ޮ?oKmOݟ/o1նctKr ~bLU[fh23-T'yA@d=(AƲO`>};.i VsoQt:-mGa@KC2BX38UćDM?m Dqw1,KYt5@(1_=eZIlaNЧ=u/L&z>s'ԇnk/xQ qO];P{i"[6kOͨc' z$ 5*/O\9~M*^ d' @.a `6k~V)b9̓b Z&K/h'FhGtOAM{hsnWI+̖!c+#l1F*Ym0)SfT EL:G3\檕$xS9v}հaּڶj"cve9U׭w'`W =*rtN'-L 6"Igoš.TJP6\͞h4*Ԫ>%}[h5&.aeEn]xFKV_0>t |I@23vT#g֝k X1`(CUCJ$m4}ûŖ@41{ u749EIϱ rwUqJBO#E")8`\ti!Pt%[ҟk8Z/4dFfl5n!.L8~9%J5]"71f͡iy+g(*[h%͞_y;#C}Fa%}KSa\dCSj}z"U0[g.2ĝ3Fƙ`du@g(>[zS)YG2饋l2Mzd]_$ {ATJo<ܖE K3k:tU%nxE!EG+G +]uoE>)ЬaEDnGZ/^g-yX#qx;ђM˂ZT=( "p)Xuҡ 5yhIhЫ"*͡t\Ŝ[ElԝU,V8$J2oZ N2xa]=7z-Mڿ/)՝^uwP9r3?K?!QeRYjR7}1 wy219:BzFVњ\cͨ/Wxwl"L݆g~"ރ3/6]o\w"m34f U`tK3n7߇yEZZq+1=Bf! "bQ/EtK- +iŒQt6w7{C\Z+ Лf2:r 5Q-y))v-hS^?3|P^Yn^YA'#yH"KD/ּ cs ]3::N9ߖ ,ůVҧE_|upK6%I8vλhnkjctm1{昰}yYq8q$/@6OV\VlW$]9mnD+ɫ+p%KYPl$}=~U@e9'_DmVp4VQ@꒳fNm7t$M' xM`N#nO6[.H&E2d&CVxz.ty* 璣HF')FElI=:'>ךj*(C(",/b+֠!koS tuWYDŽd3rXx TwBB"x] zltE5Lr`&%Z{D̡@CА# O֮GYۻMTٶxX-C@S{ʡN|6K>rS5؎8z3K=moid_\lNP`~cyAO$g5Z4]=u 41 $ʦ:k_-qG-04rc/` 7"%89Zm^RRsm} ! .(@Y Q:RsH9#HErE*iBsV:Z Em"v1H7nK(xOP y;m}Ũ2b_ƙ/NǑwk *R\@׸( '  q{irJ9h8V! RC%* VK-?BuT g Ti3WvliT\1WﶪR aSvv>|OjfbUS[W Z$'=DI"xdz{~ڠ^|[=.{26yђMՌXQaf)w,Lw)%2yRѨVīo W*Ģ׫xM3"S;CiN~: 8XOY/`ْ˫8X#i_(Qߩ=﷤1>~=ƌk*6mޭs$rKl1M3ޛ,KV%S K$3yL6K6b˅/9'j}JMb$\͑ƵZU)vPtj8$l>>A]Deil撉q>m6҄9-g贸 'ޏFmSڎ; A6JhFF/q=ϒc :V.^/gF4ޗǣ+έ6Pmw\K^9 $3B%A/ gtEBYM)UzU{I<%O b:ٍ{zP@fbogY'PGxVXElC E( + ~TN7oe ؽ2LpG *i#wr9WLjfcՙ][ACΒrY̛ `ĽҮ%nɩnW$~8uaݟO)iisjn?IKM!h@ mL! kӶ8lujF>)Y,ӴeexuA~,ֺr8p W-)5BX4{ |8R;jsˤrPX󪟸Z`TS$0˄w 9 UnP?I}\;)dPg<qbBTfg}ϧxC87Qc5iJ+&qήY%'}ؘ3Tr0ĒQw3SFKaK +1C@u\  %H?xc9Lq.Kiȴw(yjOP7-vBc=g[ܒss2HpY@U*)= Z")>l_~a9g ݞh&̏KxetvNf##]h )"t!c:dhWwk8VZͷLt:;r)ni'/$Á/yi9^ȷnyztNlw,=x"uf =ekQGy=!EfZh w-b,hfC j%v/wl,·%%IYkXm "M뎈bߡti)P~ulƃXv8#,ɗ Pl# -tZ<H$>@9,JnD73j0oMy?31}JXq~-S~OXK)yŸĆݭa͟دM8te$W*Vv#`tk7 к<3p"l-5{7b2 R;s 8/W\{\u S* ); a1q_߷\XII(s IHjr(SA`0@ 8Q;T~;p?,Rrؠ D{b;2'}q젴,Q:*JcƃLogU'Wh31X[omQ?FO:xU}Lr*3QKnNv%âe9˥Z Mw͍xsYso(ţ1Q!׀}XLk0ܺ|'nrgJ#+3\ D| A 7%|E#30N, kŤc.m2Hwh5ĩ7.bcT#SoK3'!fɯ2} it!?-E@ 3MŪGngyÅV;rF&2A]=O I9ZU[a0 +í;UH{[CzEh)S/"mErrr_==הx!3!VwЭN ØWd3ήܬ` 7E\_i#n5eΉ~)ׂ{q_=:LpY U ƒHms 13XWpUY2nT| GXНmz5H'/N ]8>;!Oa9 ;Vx  Rv˜8a W+;Vm-CK8%Yxe$S: Kl{YSؕ:WgOކ~޹g3ǟMw/ʣ2Z3 ȋBu^Gk4q +:'k_{)"i_xn=T+ ൬2U8=Ph Qκ#ד$Z)?yu"xUkJD`{(2Eމ)%:ʑG`@[.}GSt)\.1ζqգL`;t\yO|΋G^m]-"C2M&Oç*t~/}U,y7*afHyp5(R~Sdxb+M=RO{" /Y|y ".#d ~I,yN8zB"тsˍc+іkov: xY!?@N7/T Uېf08XMH1,4?_Ǚ s0{(M@eC 1#1![Whᶶv3[8Ɨ=gIjùޜʥj9[OvqE w>g*bG\Ӝ#E֨2<3|98N")R[ō-zy=MjPY6f,%"e>P}f빷jGedi#okr] F$2RWK_KF 漃;d69~pCʂ#|AFF9S/Lj>_ XDYQ hLxCHpbO7'@yԉjiq6P3uv/30QVJwM^"÷B$WXM%?)>kҗ08Df#S'O^^ ʭY&ۋSl]NfJHbb-V={yZZi⮾=8&fq &>E23d O̝yh-GwTz@ ٿ/2 s8sZn5A$=>GmІcjx\B"l?23`~]$f~@9ID ,βw<64KV>%dbwcɺ6'Z2Avi y{R_MU{Ik{7/p =AJq+ oILxġj/%r.]59\}=‹Jï&4+>WchF67D0Usz<ڜr6^oXt̉~V%Ev:F Z]#UD 4 k<3Ii jyT8XW`sNE6NGYG@+p+[}Oyy@Mf/;́7s\/R:Gs]<`&ʏ1*-U@- P"v-~}WbNlcnϗ7!">*A}~U[uނ^Y'|AN:z[n>w]~+&.\!pѴEyl*0`tt0ߚׁ{btRit=6EuQ@ƨ2(:=eqÓ q/ YKwb Kũ5+-$MrN1uv⻛?FbT⪏DXiޚD._)o#/pu!v4 6͞_ںWzq~R8j#h͕Q~CU8d&_w wX,l#dOc;U"2B%Ξ IIS2cp03m7ʼfYaԩ)0Bzj؅F~_Di673__wwǰ솏UB$Ƣ`YCwU7']Z&Ypb,-9gafjåfBA{tn}{b>7,PD&(Z\-cȪ+&a򥿜NN{gUN2T|A$7Pe|3$r\@mԗvÖJnCNJ^Yd:.Wn!] bX:[M ד[j_-4k!w1KbxL#s# @035埰"uŴ<#z&OwI-o)ä\P ^"GA{_:o^F~%SKNtogCX l15,E9ӞbݥMbџ܀Č`0,CZ2<&]XI)a^~C?;]oY]y{$9n5lEԉx' ĘhA*%#2*Rzf+pO_ ~6XO)w3;Φૺ ?̰(dG7 N(Knyڮqߏ/]:j2[A:9G 2ד;1fIUu<{(Ke1wȍ*mI0W_]nj{3Ky'C3|"RsKV[u-vMeoD:4> 8yB[sRRҷAm?yj꾎˼/0ki(Hcy2tdHxNIϠkfR][\lNP`~_ b,/ QAUᛖž&}Th ơ7sHI\\=̇܆j;S@yL\9.-7z PPUW(LhBB8d2&=/]" 5p͉AcǩiV#~ǐȝ#{}BB? ~Xe@՞{04ckC,|14!V6\6Ā"B!$ _u>pV-e&rt +kV~9mGem՗8!pKL ELC * "uj\|lmMx4m+[ըҖkx{IsS]Z:VnqNm2tu2 sANWXC{`'bHPJ8qm溌%Ll αioM@ɡZ Fr]ט~. -]W#Ѫ=`FgC2G ;vS;>W e'=Eh2yWE"zQ:ه_)U̽U'QsHH63M|f>F,͚bm/lQzt|mup@|J쟱shziRB{$Z̢ŗ{6rh`)\qЉK<-}e3a͊UE0!R㙿@]01zџKԀM}HGӳ:PS'I/0,fSQ0;E zPExi?ax2f,G ,_wMQ"RzQhEVcX]"&d>E&3WoAR>bAHRy3`z#A"p"`c"c }iu2ca;Um{Et*dQjRzZW B9 Y; 9f` 9M NH8 ]F43#"e!0{0ƿM~¨r I("d?OYqbS`Q1LO(j:x@=:7.ъJ-tCC }B`noÒ+|- 0 &;[<%k: qmtV|*Bwtf*̓5F@V6Aou*i~<O֬^JFV(:qe{eoψNf7p"FgOV]JV3qM 4.rc|A${g97 1ﭿoz\gP>yR,ƬC)s\/Wе!Bsʯ^PT# ,|ױd#Gߩߌvc. AP3w-bbFQ;yJ݂l93kʮq^5#0nP?n0 Vü MJsbӴ;n۸AAZTKjWČ6>ɬ*_ZmB1{Ia08F2ZUI{ݔIЀ {z#: NBIb΅>|g_8pTl~Kx|q6f/:g8CWUEMj 7֥m&B>WzӲ+ye>|H̞дɌ "Ov)&ƑbѶ3 p,f>")lkbweb-TWcE0&h;#,9C`M@PSZUU<5?IvEAay?5Dw/ѕ*!7g$4U\M8SLWauY9KQ7hW~* 8Pghd(aKIt+Oh* a j$nrLTP"1$\83ŸLHé8RGVvζLB`tgۄ03"ȋm"GY]jS8,W 2@R/ w xra\ʹcɩ;:m&zMniǍ]!1?"TcܔΜ ̄I[楾N  KQF~(qQ ^M…Ǣs,kՖg ڋdB8+{B֕;3EjKtu3|[ 1`X\zLgcŠޞ#5toid|t< D& Ubj%p$ĂעU/< n'pNݫw9A#)W>BGbP )> 81֝ӮX -_;P⡙|=zhX7eۙz}R_FCx$ ,z#}wK*7VBҥv p;eM!b~ct3:A\oDfXUGuXר`^{bJ,IGfY::61e,0VAas1ih_o-aʣ1NI~3&׿= JQn%ihm ؿס=\=]쬛|LVw<࡛ &>&J;7#>'\f,c*wóفn\M^K‡=z|;4BIe ?Yo&MaBuO೴| Vt:%!q`8F{emz_8pW*r/#zrb1irMe\Yn:h?H4(phsfbZ*er 1TCV NGIebD/:dra`lwnikSIOFuU/gYe~# ^IoyU 87%—)@In=:pDKB?!/~o |,//\rpkI"_hWB2F.ڑE0C,p"d {6a!a/y`.l<+ KMKM!Lj(QTnCjPxA6-fOrd65nJջU& FKSw #<`GkB"ck0=dWcaл~VͅnE:`Ec7{#=CpO|;nNhNkz?rcrL9q XI#sRS,?[#θBw4sg l,mc ʮ1/JJVt(1ߵ֟Ӈ8 KHOQatc(hS%Q㬼ZBc7_ks:Ieed`/zrݯoon:`UL WMKᦦ$?@v(V<amv5%T~%2VA?xhLxnșHcHtȨVWFsV ___,\Cq M3B{Vʿ,P,[u|7u Z}{s^,9DH^ h#?έqk[oj O_d cZHkd=_8FV:5Z^gׯ^H4S9EpKY\8hevu z-Ѐ)\yz]"=d)3Uq{ dB7U_bIKUOf}ʱ@ ӫ2ze&pIS=QkV7 zڑPyCIw<(<ju *M&b{yjRGYAJ6yF4`'bp(!JMa8k(xݫKBUqM%{$">58Aa Q. $8&Gug<҇2Y-frh g/>Fe=Am^B HXH7=}gwsox@$ Ftb8IPնb?x9[.76P6,6O?\s &BTWu $@*LEh@ Ir{TF]+U^K r+.p axV?!L {0|7Ӥ(G)T X{ cg]AAD >|p~TTXZȼ8?U8h;ȋ"pfiXeӡdpv@d/Z D.%We9tf*`.S6'b/nS]v+9qdsLфnnik=X1g}6nZ!ӏnf׷Th~O=J-wK)w(D'2&moO򩳈э@7ic092 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2d#Creator: JasPer Version 1.900.1R \@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP 1߅o1R}_@x騎ָ+e"gm~e:B<ԐRHĿQ&τ|sJ |9zI:#) 8@Lhh ˇ$}ߚ@VF!t$_}? 8q$eølE9njk=ei6adaW=k]qB s,5K%t7}/Q-IÕ߆v/9n{sI<'l]z$Y% .[|ὖV ycN 'ѽlĥ=$R_ȹt\q :p*9q.V܆R ({JC()}rlEtKy xXz۫F^YlUC-cGU>K6[*("3`/ml]m&V1#,0k7xNIΌ !@F!߆X= O% wD--AepLs |Mřz/XҴB.4i2T6v(E`MU\e5UR|3mj/=CW"M_K}hl_%qt>c x( !ORcUR@V v aצ<|GyXg4ɈB@_(MIbR~ A!V?Q6n3p:וҳ8߅8 g1R'mkCkZh,u|ۛ=F4PrlrNs?u_hEl\0?mcm)` | &(T9΋ta)FTB5`ߝ[? m.ak. )yˏ $.v!-̕&d ^J\A|>'=3ܡ<[ugS 1_@e`拽j-2DИZ]Jl_EIZJ$҂鐬j'`JVANB4%sBȭ5m&"^I7yp".T mW!m|Tq:ߞ֧zʚC|^_/ L _睃2%'G}Nnȳ}BmtDwM_tE5[/๟%$51z. =J?]g|J;2i#1CHgs,mAMfnq|N}OA۩ k ޴$3q&Ʈ#2RJ=I#tz(%,!#M ld3kLNr1DW1m#L!${[|Je)rIo]Erԟ^9UpX{wYoP.L3'حsb_ZĊ"߫0YW_&| ,owϱ$O?y& Q `f\089”GtS #4\N kܕ7RhG4EBR}NML+<h{>䟩v7=ZrJ]M36i5Lχ..8 AU./TRUvʬU{U'LuZ^s+y/rc6n=;ѷ9Z0ΈW꾅ol48CtȽ,hķr -[PRa&C5MB|eL˺A ׿<{s,+mAp] l; O(E-E9>DY@j{%s|;ʪoAO0i&*ʾi5]JKxOߝ? ? <)1P/Ңc6穾HWRM^f1W>YU8*;?P\P+}_lWhiH3>@z[ؕI=8CƒK- J ^MJ3\(s jFXdomO8A!_vQڶnZ\OTK.[|¡%^.;4HqxKBy8D öx%I1rb1.xL *aMw%i@qf5_3fi4Hg*@#kZ#,!qAuBQ8z]qNeb0eQvk?_b7g1}vu+ލZ:rLxW0^593 >ȶd/5xzbu]_ߙ `UeАR&tg @i0 M zJ`W|Jl2S' :4P~JJم==itv ^*`o^ 6::6_inK{A_k.> Jeqwid& q(GB}w!q™vu DuYAi!/kJb8KFU+f $qE>bfv:Հ ms?xx C._e9R 7iQlU3I?ǝFTc7'&#kpc?⓳MɆ{<"` 7yאDZ1KPmv," M.WHY ^wVk͜fEyRI ܳM}~p6IJJ3Վ~YliqK~&.Tle 6:y wPdlhԬ0ETdln[$Aύ WkrRrじ j>&?~R P$*rܠwcY=Έh(7sCO,\Qh12 +jq{k# zՑ{& *odpx,rR\__.c@sqQԃR lh+Ǡ=~_*[l~W50L3P V$!a$|wW1pA.IjȚi/[΢wZ,=P̘[1!}Q/<Qǭ:,s(oۋr)=TūmFZd˶bNNPZ{A^{~c5Mn߫6$>̲x|Zo$hٳÎ1${:ľ9[HԐbs6~W)̚P)b2|Z@,2cGťt^&gC" EϺ>R Bx FW*NPCVၻ=Ctm!nrQAo(olߔPxáPFϙ75}JV3n H-S}it9Q5Y[sE҃9n[wtO.v-R@&] t&i;8[0Ŭ5U f^rc*8jDS4x @ge'Eg #%p;UoE-=N+D:. a'IRD~ $B0+x~hwֆ,qDB2͝ 88Gf DuXمa 1 q|# 6 f7;" sd4?͟ʦIJm8 )̡\k8mmmJTq/ub`F$&0 $yx|8BijcX Wm$I${߭$pNE1e\o0Y]˃S|\g`3H\Uɡ,@GnI$I$'艆ݡn_Ͽ0R1H.)F1W5?mEǺMA| &V I$I%)`.X6Qﵚ4h=u=ZEX\cɄ_o~5 c.uAwJ꼵)+ D #sz| @mmBHc9aՍ <bJi0ժ'V/uGZaLYúIβ!!M it<()89 RZN[uͩ-3 Я(˚;Gn^,-Sզ9$*coUsMCMcFe}bu-c\W+њz@!(]}5+}521l6ܟ=|~p̕Rbf8z @m݂گ<{8O $Q&^7DI z2A1VQ=(FiW6uԒa 4;E.xzF 2Ç[禖9oE]4Ģ5ӁqX8JnOTܔ4g& k9N|5ȶ0fhXi0+ @uBKp*$?*2JВ.O,Ik_Jcoà >e'k'| t=@OQXol*b I&!@;O;ߟF>?@d4\AZ 9W)bl}^r \S'CDH OiרI ,ϮyݸY/ 7IB`T\-3~W9 Us/}? @Vpb"Xsbo ,>*HLh`!({?[y#[3 ;Tl*Ug\#z1'5ܽc2A`)$Ʉod|| MfWWԛ\O<@/ccmnn~3bEu,&Oq:1puE7fpBOWw-9eտE(ZWVyI?BE+=w켻ȷkxjڭV #i' @:ZHx٥[ǟ@]>8/G4Ⱦfqiڪsƕ1 qii)>fW䚺~2q}' ,5`+ageSWY*;` k7sUΞkc;wzx/ DuX7f0qD&R6l1~Rbkxl^zOUb;^N?Jjk^o0X#A$I%7dܑ,ɣPl}'mB3ZV$=zĘ_!yu98Ǎ9A$I$>|Sy^TtUR=)ߘԭn<ӎWwcTfBA!"Icee0uDX˕PiOFy@ڦsqg%oԺJ^T0vPBv5pPŠPv9^roƓ쳠f0)ےI$Hۦ2bze܄S8%ɃjA P9hJ IE ot G/_s$[^[+gF8lےI$XA](^jc2-b XRI0txECaSlC䠚Le6v^G!pkM]v/vqH]4Upו+{9+&4 Z8(H^֨/G_idleivTpf;tiV\ʏ۟VUF *_zHY7@M؈\2u23'vzHn1űb`=˂xr L\gaX5#e$ ?Ç|GXXCDN9_"IjӶfZo:6+ FeO`kƈ MN,E|r??xc6"(.:"(i8baF[h'=e$XgSyka.?I]ߣ2lʒ.@ѷ Ld|0>ຏD2 fZMWb4K+9+1/:T(Fj={4y.nm4.OkA}+I W2x32g_󡮵SŽHʝM3$)#Mp?F2` (;nݜ:m!" __)U~ϠDG ?h)N1E:vQtqLexZ7ó^g XDKpۺQ ·{ߵ̋58=%Y!GKIۊۦTCzc#8fs1O@鿝ׂ* ?Ո2*Fa B @h%̚JR tt{! w~vu_ERZF0s7JLIohY?ýwwcXط3$J_"5IDB"4ob~ #{a?'@+n 3E|uXxހbb嗙:Y)@>">Á5A`(s8{/t^¶Ϣ#[,1#7ckSG۽׷8sВWkcӢp+ۚOb뤼"ss..ea"a/n *LRk+MO ykowsaq,^фqu mz ovL0 䡞j~ AOx*zxpJ>(<@P2pyu&eLCgpr:|s<ֲTW0;}"sɤvyW"8Ig,Ӫ4s13up+ᠸ~7h !&MaCWj0-mP̉8@ɉXǢs>Bӳu 5o7ܳO %Nf/%g xǂ34BO U1~xx(`nԭ@A8 6fD=g bl{(ҙ>mkKTAdcyb8-md>< 'W> T1cdY]I7)YCQz^PZOkicqpq A  TblwրjW?$S߅S? =sDQF7*@ĬI ؆]CIOD7t(*v~n19޲|X iWeۏӑm'|DA%ah~bACf*BՂՔ_SgWw;s*-fD}uBGyc%rG.4= K $5 btǀ8dƭ+'R0E·Fͨ~ruyg\5-q?8 ׯB_5@ f͙kZ>8GpZ:alzɟ" g)Q6m:)b#?&q]ecip8# ;$MΥef'@ q^+?nɢOk ~oS#a!THC@F 0 @#ѩf <׍z6?0⣫N%/=Oؔx5EZ %pw ~B3|z0GR0GMUq á|y|P޶fD(=*po7, k&_;DŽQS ł {qbKɛaۏj, 3mrӃҜGz+^άoYr0U#jI|LҏQăP/kh,r0ޤZP}_ r\%oh]VGHnlV f<.sw 9T\ ЮNLGCc8;B䌘[lQCI,ʑ)e1V M8髚cC*[z 5Ug ]DiCm%S>8v͘- z@^똃Smo+l%C܃V =J=h0q}#u#ò&y'X#h`ϪZxp>"[JjRpSP&}h ~2'j*£V @ \Z;G J>|yvā*䢰6R;a5s !;s&"p]J-O [6s"FU nm^> ßN3BP8/ZxK7W>Q=^0&چ) Z,-n L"U0ۊK`]Vy~wwq0#Zgcz6m)I]_/#o-0IY!殎K0H00Jl5=it^ L_h 'έ>ț>h4fNQ&]hl6rQv6^ WP4SeKFuǁҖù,Ɂ ֹ kꞠۯi3Mb I-$\~9- )\mڼ ͵|SWG4E<R/z.i&|m{t6C[7)slE~2RkȢ/R'=&Tȣd?~oEM]"oZ;_LnͧtAQws*EX'⿾O߽9YR(eNʷ ]C.C  iOӝdnjHsxcsV-Fdت棣gS k((*=o"h/('miv&d-BfD:dTP72thK]&>&oB[33]%R&V~z$YF}\ǥ o+PnamYRa5c8l:nW:o'6'e1܃'DHjieeGY9Z<$ҧ%(RnOדRem{qMH-qH_ 0oJqu{ )r2} K.-]Q9 ϻ7Xў+X2pަOr3,}5k$P^H<<]@"-Ti=#lWM+ .Yf$s}RTrRIN FO u5|g:TYJ2/Ew̸<Њk2QUAHn+Nɭ}']28Pם68ϽTr&/`*~.%|h'SdRDۥ2ciWATVd^#O37qJ $V IT󿺎i3on:VaE䍨+ZPPا$(,YS}eQ0AYB(KWQb X bW$L~hum{GUQݚ^3#-Dj ̥*_jAݦX' JgdL59Q9OYE,[_-q?8>56IR8IrI%ro!4\  o6dx.,G$Kh%vxv$R&+axEr<¸ N pGyWW/}~_ !xpҳo7%s^H I2NEj I@y bkgٔ/>CuN.UY)x[rBpκ&nG/5-B>X Lt㾴Vfu9K0 ,3%"!:f սԞRK/  Ftx]. VliyJj|*yN?[ V:JTaXCCH|2.9Y!Gk91H!+QyˣR\euT3cpvy-k@KFh,M . yNjm鉏QJ40?;")\pnXl^IK}L)0H]s P 1ۘ;J'Xx mȰUqm mE=추\jdh8ouvа 7e( =IBrW̳t ¦dvJ@3qE]DS%}&a~V0DHZ%K{-a,|$:)YPϏwDu gQ ]OiR_7%CQhj)GEx &R@F_ +s'/:gꄞ&7 Su@M t`Cb3o2޵k$R~H2j4eVAӌ pӑaHJ;Oy'ja'濺ZOVB䂅l4kwEiۃ.{u!^յuIʩ'gX}E%÷[lS9" f yOuY|gtlxyN˲d"|u"GA 3hّx&5@j?AUx&4T, 6d 2]`=U!+ſ' ~k$:Xm]_4(NFT2UI-Ԁ/Q Z{-A_`?vKFGU3NR)IpGd^wIogG\r1L9N4 _`TK|SH>vx=L>8 9L`Pg ؖc"O#my9K)p;rJSEKÂElS|nܟC E;nμꖽϢHh(jwYpm+69ݭo1C``wV!+ꦛUQM^?S#ٝ5skL+ijv'Df 60?u uBX.~ǹm*/ҵscZKU`􏹚 S=fL3^_k/[+\O_/MOܡ׏/E[C߳* !3Dvk+V*⡺)Hd6Rg+jˠW, 2Fњ[ױҷMa$nx7kCLj(eL,fNUK. |cr­PYm R֔֜ճҔiWWu~/8yD-դ6_#o𥳘zpڽMVvfsӓ[=\qoNU@e ];) _H:Rn,yzѩRbQd lӷ ;Vf 8X7(4.F]}~nz:E[@$qɚi)%♶#h%?B!kE[IY?)۔WnwiI_6K} ϤjL69tY%ciCq85Q'}<Hp~" xw'x;]~줏kg.e?xt *⁷,kWXG~s5ڂ.wA[M[^#$[콒떋\AOW"@܀ϝx& mE*U<;;31y}A4UJSx~|Zs3k ; UL꧟v8Ėܨ%!`1j{.rlKճNfj)Y $G|"噩A/c+\$vmX9i@/ Q9HK#cˁArpan{Y+EtrM-H(P!X9@E]~ imEODvyt˔ο~?[?Eb(B'}.rjbǔ.qCqRwuc!0 *6tۥ@^qP[:gZ' :p[\B=]LR#>N_m ?׸%w9Da{OVl@{%6>u+(*iy[&l``!HErF-՜T3ǁj->/s&ךo:~.)0?KyY]'f(!b0lCCOŲ6vHrV~V5hכFiӫz(JCc4v\cTh e{Z4S{}$(cÊ 3uiŭ/oX؜zSD0(腹_Nu@REY-q> quLu ]937[ZF1z>V y*|mMf+&5s!&9Vj uT !%}/BpIIFVDZi巃ң^}yl|~7'}\K[J奊0q8GABoEv"r2E4.+ 8J̫ȳ}\" jssM:=n&7N݊CDrz.,rw!$"ɦȋз9%vIċӇrWOuuc)sc7r0m-$I zJsմ ]AE۱r:yt_<Q6$JRJ4gM@xލ&y~IQ_ u_l"2&\h״ eyc'`Y|h-'~>0gfFq}yU1yM_OYِ2g{N 9URC.R)QT!|wb'v8 T8jNQ5wQswj; S٩mq5! G9dg;|u84SL /cq+ֹ"YFڄ"l~zHCig{䷂HW_{s=rޤJk(,3z :Q0>M {`oR;LUsrP>;Pv)@MphUY``e?蘉UToŒٰͮbfpleam$x+}b0jXR K"Tj.ݲ0īLlW^ d7E§0zCpj\*?\Mx޲)aEvIse7i4pX2?.>Bkg朽t",,4L. Ri^@ys-/Qͯ2: mdMh9]#MѕtYd(cͬs_3Y5N7*8#(1hqP1#̂983eBlĶ^*=Hoq .,P > zvhOܢdu}yl-CE 4ӟ+rnh_a}Xר%ͮT~A})&bkO4r9`QU ώB$EEAHUV 2")! #8'RSO4t+R֍>Пɻ<-ORTtF2 T+M Luey4{Wɋh@.F4fcZʱ6vM [(,(ࢰb0 ? B|J; 74X,$]9dPMPrp.Zih6T\Km-?z]nYwW8HKk`x6;@F־~rG.N!ã0JOyv6rdhFNSJv"*0Dn Ԑũ궭 tKV][Kium.ǚ\ kQ;0BwSd2*΅.K2mՅ뿝ޛ9ש8q;[ϔbD%BW[|SРW;EZVtؼ:ԓ䯁<[2Jg,/'T_UNBf"3%`vl3Ӛ7gpTxt$ kJBH|,\;`YnM'-8z`+:DnOz|qB`GMJ7痕"U;`|VHdݥ!#с'L'>6U :%lc6̿:IUe'n/?Cm7_k/ؿ 8A8ȸaMd9*;`k1Z1ڎ:)0/!q FwFC &e:2r8BC)iFCC}7Yjum^ez? '2cg,%_a7 xMs=T}*-XqKzWs7@i;n+tI10 eci@:$ ^=s#}(u/:%Uaɱdlp=Zlr@8Uw9&C5}x͆po=%j=*#Pv[e"ZD$ie3p599LJ_/S>;Ye Û(KxK0aΪ @E7/5DTH;F B/k#2ФAZ e&l~{wC6)gRÄ$Qe:F3R1ACN(ɕ+۵}OEO:^Y k@&la o{TUKRL0x hĘ/AZ7kʔb \+2њwG63FyN"uNƒ6fwT{! ᾨX1jk%NjVLǺh$QNْlE 2Dʭ*#>'bch*g vtw7_3=` Fw|`.x ެl^0V\3'3>_CԃqB\Scw%X}<'[4+.i,W صg&ɧ˚E޿ȁ+ Ae"5"+Mx8f-U8 R3_1fsMEEK4tC %;-:0E'(dtbIăcsW؉R'](ps8R0&\m+'F'bS[S Lů]Y,`<_ X(o0<u~"9Hɂ4u˷ 7a.}ڨZH7φk-e[P0 S_Uqڐ,f *.Y2jl7𴐇m:O"*gu6?g)bݶANeUABTa].tr&K}*V[uYK *'iޙG{{@*ZH樚h<% #)T *j@;~ R6(k3<PT tdAsüzTdԹ-.aNN- ߓ)@bִk 7B{Ŵ+ aπ## H9 7J,pZ+&!n[ - tsBt)鮼J.)0I~* ?Iئ"BLBCEZWwϑ Sq~PBY;^A3h{ubzI 7_w.eHǽAg*3gJpC7îOw/G7g/'ѢPmAC06hVt䘴&(bCh6d.)lR6#M""ÝQ֥sU&&ò) %Yv˳TpvbX"Tn%G+Ftߋ{) \/ qMZe7=@acq$1߶ihRKs~3m%/6yE@$ jH;^B 4W4<.' ϸJFQV+^NfM AOC: 9yB\4{O GЭ /hO)^1QUw 1'щa-P&3Zμ2 b~{|Ek\ny<0}븘">⯺(y M㰫qKb#aDW#CJM 8wƧҞ4'h%sUV+حwR$ʇ7%:.Sa&u}ꂦԷs ]y\ 7j;0V{܋rx)fb!ɂd}Rmϐ}Q/DWuF*x ={sִ֖}?F Q eFR 񍗍:ePr8>XǙn!ctWP~}JP^17ˤ/?6L1pPtV3x?nrnj fY_8*;M`TĘeUH%,e vO^nTjSOz6ǒɾX |QBG<^@l 8k~OgC_Md/lS "d7Md_.:? h5q4wyњȚ<ZBy - o TC'Xr-{ұ]\G8yͯ̕ ?};QDM ݹ}U '*$dXS6HuS3cFOZ,': ⌕kZ4/{86[莪X7X Kwl ̟P?Jb>NT {K&&֐i 3Hd%ݸVhM=Jo\pRO]I|!arf?'sw&IL6JI:WjCn8yYKjj9&m/pgk lg ~horD4Š le^U?6D|Awf~LU|)-sћ`uNmD>TP6щOCs-nW&%WPþ1Snvw)p46US MJ%$`Fo)&3QYtyɅ6><=%)3 O#xi,ʦw6ILVswmotZ@D*J㓭[ZvB% "/ER~~KR, o 9 kV  5@q<`;e^a*¢s(0v)>q}>rx aSr(!o1Ub0гagdr2$ą(_x rՈ>.^kS 5@'T&) ~3mUW7\;`x a90ǒtRId )V߫A=0:w〘Z+E?Qc{.K/,b˅g4^Tľ^&\xCr Q)숲E{ OgΌ\]?n Y#k<7%ޭ)WJBvYភD-N<' we|rLG.MA2B/''_+Ek]<2DRRuwպY#L:C$O /  ?=I)&4+P@O"YkV W|ԏj*"8Z8QCm6t6X9ԃ!|L&U\qb P[49l+iߢ߂6-}h~f9qpGrm7,"gU dkĖ,J)=~C߲gtAE#ĚY B!|okIJh1߄5c=.G$c ^q+عdiv Gx?~BF@X=@ƙ/^ɰ~ ?oV{擾8gr%Op?!jZ'cFu9&,޸ HPH(_2ՊĈJ{\zVI;;%vRU K{(58໣X!͋АM>b Et:gt:xKt7{tc:R8A8ۑ)F^-UJW_Hr%5T)z2kb4Yhl/}C.xgB%ÊL7d)1lg^l٣ʤP:a*} ì4u  .^hkOH~(39Y!a2k>}5ć1CJJː4TGj,R+KW)bJ񦼼q7r$C" >(,vJy-ku4%fNvWpy˂B\Fv'7yjrjdR6>WF7#mJdn*VǙ-ufRT8p5{W7irļz6N7m_L\8fܜt= 7gF0x;/~G c^l7yGgS -1iMUKVYpy;nCiDѩȲE%OsXD"kW"䋋|6hElO"T^xo/c#5qd T[=q;zxaUQčǍr/%-TI"Et4]eVP\\>p!KrC>ag˔:ogIݏcoyJG)O|1O0=\(8>)hݚ BڴZKǐ$a{m85a}(aw+ѳIE=L5ו/o=aG6؃wHPmcOǁ'& ѱ 1}Z;NK{X 3bufAh^8;XEud&>qb"EJBfs[˘̠Կ))BT\` "\翜FB>"EM>QBgq?:Jj~Z4ׅjyIj/$4՝ <?{ڬ r🩅R/RO.njh튺^nYXi{Ax +&X(fs,њ)nO4 :S/W<:%^zÛ`'w@V/r@{xOȌӉf.4>y!i*]Qeihi1J~#T=nmi;z:8AgXxOU"p?Q}gNA£+H..p-&H{c|{z|vZ^^.9J UX^PD"T,-VкG`q.Ήc tdiDjED}cP7V(v F=#;oopQ_ʂz"ے-5Jl'nI}Dy N*b5sOa Y9+(T~~يĥ>#n'^6ۭUnD쎠Mtz1z4|'3Qצ@-ӤYDEBIKoYdu^@ LNViJ 3nӐ:Ǿڄċ"7WͩnmJ;N9fK ־\ݸYxCڏA⣗hwsRhWdLjoɗuYG׈ S'Ѷ'3%AD~c_J!*|5zhU+:7z2Õ/-FPGU>m%6C|G܄\cDZ\^O''`;YsÓzu :)=/pHP۠ZᗕY"jlL.qXlM]rDp2Fcwp_Dj(?#1Vam"ol$ )x:n:1h|ފkJF`\0v^]o2%C$5c(x6_K%(}*~˷b>2Y@GxGθrN>x!A1hWZ?sA/A^AlTliQ\mV\$y귆ZtyDJ)BO_{).Ł47Lܕ>3 (I>M-?@N`I+Q\OxݣrraNN-KTY74_[C.8~^ պ;viB!vG;E@9ZӏhuKiuM-`bbAZg՗iz넉i @yքA&nRd7zMk̻<-+PmLU@dI'\okbhg M_ ҩ6[kթ9y;\vjg(971yՈM'bKR1ofˈ[D(-]&c P'T'"{V"r:J.>\L@,CǑta8T[zn'5 ӗɝ%8>~Zi6{qyu:ۮD&(8 /(sEKp"B( K`]_j U˔):#&!ZEmzTe~!Fz #1qp,8gP$0~N!,q8Z G#""QgI-}ŨeNzr X.GA`?JMa8nGїu68/I6 q>f;+3wɉp}͓=45 O'F6l7#uvb L `ż1 (-Io#T%S RYۓʏx &9Uux%A: HCuΜwF0Őzig"M-X֬$9fx۞ĀL1I+ K7Ϸ1먫]?R~ٗfnH:! ՏFP--'`l;׹1?+6ﺅH`5ӚsdGa <,C10b8S9,̑ ~y"$Hjv!ްZ~b )wUC3Z 7Xd6w~Y Γ VQ%W4"@+.8س E]9jT.Y1|Oy)֎3w]a<{ԠiBfM86\(~t Jr4Xh̤_D>Q4lj1IH6B!39{S2I3laimhe ,DDl}NWfld(V6Ȭ A&SXfn1:793 r#ƚ]/Co} `]D2ۜYK|yV:Wv? ѷtK[S9!Ҍ-4#l4 tr-g!ۑqE˴ čwqy/N9<(; !yy"T "0[kD`K{JΙn| LmW,x{v n1e->衝y?zfyHFy,K`Y*1cד : N= 벴oPfLQy{gƭ3 Cɐ]}('N$Npi|xx_*ZgUj 7-NCTQlS*+ہ>5]Ρ J@ƳľIcGWVQ`7At)7Ϻ#ɞêQ~5] ڿp3\&C])h+ RŎ4EXF29dOTCp|`LcRx9u2w~2c\Hix)&sk;v.maȞ]GC6;0'lTk&oP32ݪ|\@&R>:rվH[{&1Vx tquwV'(z7D坳8v䓇fbU"v]an%@,S@NW)9~O0`tVn}|I X>UVyuG[JWCqSFQ.SnRĢף5y&V_I_) F>~eYI%mPkGʕc 5 U1*) \i۪fտ=}.c`9ۆQݍ@ ̻k mAQj.o"Wڪqv a̎0%4$V#oKc\-}b1w.VҶx ҋk2Vd5'SY6xp=Ar1~(Cw؋{Xz?ͼ bǙWxoQx# aކC0B{!9YB?jIؤ`A @: bdSzWɄxT/fOLcs`\,P?2ΒiYO ϩލ>~pr`S廱T`^cЭ81fׄ1o+qҌz%p~3=iw(b1Jז˙SC@kg!'B]9( C(C*RN4sĀ9@2;8ArS4@.Hȏp{~d} | i)ltO0 CA*PɶeyL-[yȷVI7+! В 1ه6>nLz=%tˠL#ٓ|0F/<8\Pa;^aƖlHtF$ )BB7UjXKPq@&Hz9ݦMT*Xi0}>SjRŨѕ,[uLi5dkn˺/]@fz׺dɠ(u-7a'0z_,jJ.S8*ˉ-1%F%wL~eR/EiMW2#߮apLc)Im*g{OQl_:?fq]uS7ܻNGV9yaZUk,7FN77i8ؼ\5nEIN2K"}׬qe9fԂo7*3hQe@Npy&R/>ง[|0"D]q<)SWR3px`ob5X]LICF #)A6=c'v;ʛt;d$}b9 vB|i;+_T'B2rƦts{4o8B㎷a\rV#CK2F!&WgbgtC.ӯx?xx xZz,ai3>56®BdT`T(ҕO)-TiqBͯp1L<cd*+oK99V^P]a;؀Fom 1E*4b~op[_4_ϭoxIrO =%.hC͚O$%w_u4Kf<%Yw̪s@k؉̠g/ a 3 ~FN]&4E˧=eaH,U0}x[ #!<=u0"2E*>^(muc{*Syw.*Ģ >_SH8\rtSK̦wf&nT_pm];h#TT+qu:cu :yIct7ty:W8A8ۑ'% (=xlHvH=粧NߕZ~셍*ihw`MtI kDb }q2 <4.B {2T*qJIe MCO-@{y&ZP ,OIm$+yoՠٔZRv_!;=LȜ}ǵPn}@e?>T;W- jވu`cncY?bQGv&bUu_d\ HSzCi@0^. { 8OY&TvZ"`KY;O5a~EweX?^%a4u.c$ݭQo6M˦6&% ԡ${ɴ2` C`Y'rGkK/6]Y"v=G|p4s^R թpi1C%b@0VSXB[4d1 q""*L?EX!Q~h%`DeG!L`CBJLV,?+ &YǜSzEd@ۛ1hkK:I&-Hx)yVEqʏޢz"9%yAZ(uZwR|x^vxOۚ:hJsP'V>f@ :с$|n3t-?Wf}ԁKJ4,5W.u%9TGʷz1 0ؘ1Id^˿vA{'B {7z:5+BP FYs7fF[I*8=,>A` x Cmhf%z8Aޘ8Yv.jj{(C=Q*!}pN 8ڼE.UM&:CTm.8Fs!zǨN 1I mm<}1}Rۧ UpD%U.ZXAe`(k%Z,"4rp9;lW >}߄Wo;ߒ\FE sbD3M"CzxxX=0@Է2]d ap{\p>V[mcĬT<'piܨIhyo.L + Zm&:\I>L- `MFFam*1bpb024@ B 왍H\U"Zg6숧L#:c&~"i>mv.J{ZIpK2޸aܜGE-/,&nڂ&vl:h%WJ0 \gJ8\> s՟%^fb܃/{1[f^K.Qs]*;5R8O;NJsmB깵Pg#5U<_cklH9> mYKyzPN:TwjVm`x3Q@%7SHօpK`aGҵs@2qqF2+7pMQ$R_|\UnQm uI/-ҴvvRm;55:v=iMKO`:tgv I[aDo6ۭUn ߏD@G@پž-jtΕ$ %H8)Vo6r$O3Fߞ$_%]d>8}Rr`8=$b.Oj Wz!?MfJAOeζ &5ރȇey&%IorS,S^ ;8CA #)~PC^ g`Ts00;Ms&eqsB(d{e͒7rDTp ڴB[o#qZ$US"WxYZn蕾6sˌbj:Mz-ĕG@,93U@MJAxWKc=m)4mhm8 ˍ+9?GުLYVǢ[4XM$q<\怒(<0EN ٢EUY6 %&_8aGƊLsJ:0FH $7K: ^?G\g:el3Ջ!i!@$?jZ$\ YA4-|4 %A9pn@|oCb tJtHY>>x ;tR6ofb;Qø/M-ǶKW6pqu?+_|jgv[ [ntFP .2B[&h'HۆLVBx 9ms X PzʹRS>XN'Xu;{ҧƊ YO) 3;aNN-KTY74_aW5^:ZC V!ަ8tQS Xb(EVa/f~ė?]tjaBŌ&0l/I]҈]Ad}ח00~E@N`^WkF"d0ĚР(5pUS@&Na>8[mT?)PegL0U;̊* zNB:qU^Kjm% z> Q_¢"fQt pHSn-% xEn]v`أ2MP Lvz|2%xjսy7}l$|$CBNJlxG2SbxD* %lD:"W OfrQ\Ȓ+Ym|D֡u5XھTN:]+$T:6Q` lhx~9W|, riܩ#p6jSZ)!8z$G *Ju2Sceyo01,"l͝00]؝oipոlAڛ$?i? =z֏e~"~aoLZm"㐙nC%4֪9PY1<:yWmJərEvb_zQmuJMa8nG%-O 6آ(*KL"zTF ndq?$\,rqXmMj,q59"B?[TpMbt,n o.s B)=X&۲`铄ۗ%^DuW a ^%*C\ r]aj d TFT'dPgh_ŷ : )mpB.!v6\ OV^K2U~ &p̤9k,̫Jp2#mTe(3e- P=rs{+0̇Һ$77)BsH~$r) ϡqBmU9iI9m|Ԛ+"{(dUípN'Ulq(Op T;ھ*=JjMw`|,SAKX%M`aWroFk^?,M@HD=F/  bĉ_1eV$ },+BB[+f bC$a' Ԥzy֐yR$sf}I yBqw|tൔvazwH'jH ?h\,bB2C2vW M 0hS%!7ެ~beDۺVán&W3Mx> ,)Gc&n +!k78͗59 ˜sBX}G~?2#J7?@=_06a4$̖#=ga *%֦3vqR) mxڦ'@p9cny\*e %RF(% A_gm[f~IwH@OՉԲQ%: 僝̣̋6!"jrz3ie2Ha7Da_h|բ($to&u=CaU߈& `zbn*ߤ늂?].'&Rh.*] #@q}^s}6>ei [.^iI8o] (=LqLE7Sk)Uf:*yf33  ؗj=6RVǦ?~5ǖfIrVސÉe@p# @:VI}veEp5lvY0Q_,s5)S~7FB諒 ɀKDeu2hZQisUP9jdc(qч8ڽ<|&'6&Q^zڕo)!E"ma_; ǶB$D&G@`{30-Ǹ06'e#=CIW wWoǻmXY*!jܢb @?tv`Wjd(m?-8MzyL:$nT3J4sjhn WdO.mCwUB^M>9 \eFl=$o#g-]YDDs2s$}|#W.'s3Ġe77j3쟆dq3]wYuI~JΉ $~_=0y9|K'.!ܤ,s{R\g6hM$K(62Ҹ~ {aB>(_zɌNWd蔎C`&ۨ9ӾǿguCwR0^6);~iQE^_u./y1ZX gܛIaaj,yƐ-X JOufx^%;[b`ޟf5 ~"˝#,*Ytؖ8b0G)I&pE8atؐ_mB*AƐ8A]*P 9YcFR(IOI^=XZ}rJRH`G/݊+z2FzW* ?f)|8Jv`Gfx>X^t/7Rq7GC~%'n7vB΀½E>?yAOA]X]j t~&f.s,T ] |.PǴ4O%: p*<Ϛ!6Ek-.s*fBro{|Hy^9p`.`_ɯ]_Ʃj~Zf6Nڃ8м/bj(7@4R 0q8{bMmx1o%+G)'q?1yANx^Ո9gu'~nht;< -?^0dX=Z3rpug$orIe\miͷ9%KȭͥS,%eb Ʉ瀛J W)Z &׻ A8H$=byhQQќ$g/i53;3")BLz'aUM.Jik~Xл-tr4 v|i֖L_WZAPxΩsT[Ns%@:f!jzd2|znC {NZ酁הbE bt";3hx\̢6>93:8xFբZdˏEn_;]ŷ#>]kB4er9f]9*=Zݳf[3?+xZ.7mQv%:%G@딩ǘq9FV M]tX؈/`5朓9V7jpjȡr[P'qJ+u-Nv=(Mt=ݡ%%K>̦'{g2W))9/ZAP(( CL6z$;&31"˿01)cWAcyl9v7FӘ];}z.z"Ja*76y+(^BKDQodoBV80% QcDߨVr5 ]VbCVUUB?$%Ch$qPx%kSкV49ᑏξ|hqӒ'#g`rcH{:!AsT@<_1SD5lWb8a J3b#yo6I2r]5yo;0θ|CÏ"`@ve-MrI3I.Ўڈ}*G8F5Wxe@2/3f*DPpf30* PdQ{]op|-i-%! SP7?/v&ҎKys 蕸q5=sMYM2NV__\*9P|kI[z2sk z"{MP5W_KZa"G x9Uq+{Us,zs}aIB[MvH5dx{ uT;uR e&Lt@x)H\cÇ~*4\7b]T2tϲ( 3#8Q9o QQ08K>Մ jG:_a%;ݓ$PItndޯ*,y::Ϊ=9a#˯f_;i 3c9X[P(DVRY.e}HtQ= ?/IDbsrg+6]r{3`3,?i}3خul˜V im&cUbؗgCHe%i[~ E6}- t.Idr[IÒq+?Hhʾ!,oowV\V o,\Wl&$W9e`&E;#wδNgӋڼ˭f@V.j4@ `xJo#NrӿVlBQ|*dD)%mwgPWUM_`Tl؏tg\"qWֱ8Ѐ a)+.86 al,REt{͠sN5z Ywl6s||F1tKgV-?T)4 ^TѠ٢HF tğmOo=1.CǾ ,; 0va/a. .AFΞ̮ʌoE<94\ "M&_漸`:9̳\~R )UwʹNx:@uܘy ??*@ A8U8Gv[;JDO.嶰/ ]6.(6j`LB4ɠLG޺oCD=L|jk[+\J?Zv=ee띒pﮖrѫ.D=Ex&]L< OMJ 5C_Ti8y5_n-f&So?Sb?0!΍  nwg[@$?d̥[[=T,A<ϰHDam /[t6LxU>;oNzilJb(?$ I` /F\|m!u;g_Bf^՝o[/( Wƕ. P% .@F[IHWő $9,0;xmU&bь {!Zc@7/ 'HȶӁhKHLC!X E&;7|Uΐ׳էCO]RKX[X:X;yvR.ear_(ia T>^X^ U<+;W,eex4Xk hWQ}bQqSy|\P b*^F>ʡB502@f#-F\>hGS' +80AXl,KdM"bW YfhKy 0THiuF&h;gR#iq}PO^e'fQ&m0TIZ7'Vpb?1(4 st@ Ή YJ55Sߪus F(KGG.ngDp}& LjxrA𪇸dGA{dU °()$7Zpr倿"x.+'[6UE13y!LuGx3߹K3C_58q18ui|EŶ:d:f|hXȭn!ݺN`0{0*K$YkF۱lOEU/MF J*ruf &HNCRnc\@u1>#pd*7[PmO)s^%}77<#9aLV:wO?}w7vo:̹`kX;X'8z`5xՃ< Z}?QFW׿~wU/5:41O_y9F3Es~݃c>,DF:KBbϘ(~ɀlFM<;s-ptcLe4 } EwC֒.m'VxU9IxoQh-d}>mi݈LB?u+LOdl_ \W{SB^Vt-L4Q=Ā6C?ACz(Ыy~Rݫȯ#:i &5lcHy:Zg^bbp~!}e}8i4A[4R̰s[m&rxէ_3H,jk~Kwf$\q"\אvHFhPvA*7_`Ab2YTZ}e.Ȫ.d D,E@]%i͜O6( "AГ݌ʦsnX vr9JD Fk-xڡ5BĺWDb.HVTH&uW;{lõr٥pK)ZE+0`\;]Ar9BI(u,1ƝЊ-8/ƕQi5͔K{ҥWSŀHc<n"8.LNY7iyy vh0;)*T,+*lQHMgJ4ٺtRpLXٞŘD茥-x[[~=#h;OوC9 ܇"޽韷 kHċ]¨)UTGN #gwǽv5CÉDf={j--R.:/j(*NO{l rA\7nFJw[/:~R6وBēhAǎS& #tqݸ"܂8 bsMbRNd>chxt[iWXXx~MJQk6jZFníʙF)!6YnL3k YMRqP%j0}ۅv+Si{Gy? rF}Q )JSBk[=:o0'Ύ~;g2]4nFMrIgX+)! ,nm?<˶A)佃"o*ݖ9+1_*`N5#Snhﺿ;qQbf0gx߀}D}ӡ{m^H+z>#ekiq?/ݫ=It܌½#ל1ͭi kZ>˪O1 ԪS!?'mmd b0kьB=[:HjAkzWk E.P(jf5Y9k(2 '1c o}vMyH|LL}ehM2kQlPނ^4$TimeD\/l EcRӒ:xܳe^bODY ʆ+CCmn.¾=pRith/ 0J_#./f4:, xÔ2L;\}]48`>'eݭŬ_v҄mFun6@==bK^ۇ/Ӛ6nmv9QnNJtka3xVTqQaJS`Uyī&| ƕٻ! ćMNS菮ImC8xqtZjŬ0osv#b;]IUeŞnÇQ_9ۇ;j7j7,~#-4l*?Y&l.t[L%bAb٢YW+E.ЃCAmꂮ*&Rm0<.R) /"+g$5J߄Z&PCvl 4~H=e Wm)@r5f7Q9'43 5ò9+l,`-2o})Pe9f-t9z,EO[k}U jB7D 3~}̝v앢ٓh}  &KWʲ\~Ҟ| Հ95?U@-ҀyfjlE,)}ܘB_a/H=krmur@am枍KRJ.?C 0U qȍ7~9*}˜T&+ ;rܔG)t҆̐͝cgJ䤹]iaԠS},ǀ%E.QZ=uk` z]N8Q͢e=ä)釳`x_ي # e#L|܆ًzDd[ئ_n DNY_cXw??AWx`.6I8R #_C].BItp'{šc!);=a1RzQ^k\tMTeAW7P#Ԡd5mq%D褖r}F$_Bɗe!49AZ U1砇\jP P'NhAh:@ gt"3dAk Ns0XYgYx{Q52 EǗ2FZ-N\ ?gph@ 0/d(!)ƽ)6"_շu[V?P"Юv窩:/؈F(<^[2sN`OaV*e(4ǤH TQF4mQTQ|,Bn3 qE:^Tc1uzv˷rQ$ {/Wc3qj/H={TuM XZ. F6lp!!窩:/y`c eĥ0K.:~ 7##ن4ga6W RW@a! j%&4Ғfдd*m0LTJPX+_yQ<-գBGI)yGT#˥#'elU~R?b_Jz׷iJwi>H!C F]7Ht-{Px'?ٮU]YgZ=fJDJ1D!t Ic w?{aV*C:f̡q@DAi7>)xtgS $&b!A֟Sw!Q;7LBzcȃ"]ޓj2]r"CNh6WÖ3Kl]Rc~)FlذrLK.j"JkgQxBGQk\{AԎcP~ W- Hcr7zwS% m`52O0TfgYU}I?Jڲ3;- k")!,WBC@:]fHW0⫭e?}cA.$EM98 !-]a%;\B.kۛC~Ñ7,FT\3}Dғm$jq-9/ =Z$gX h&BrJ%=<ٵFjM37XڌJ0Xҭ\*Yi-K"xpK_OЛ!5,3dffYw@%ӻt0$\FVG84&3I rP-{h)$YR~YKƁcֽ̆$سpS\Ѭ)0΋5pDj2 -}J.6q)} h r}3G+.'y*SiH|ږd6= h׮m5[MQ#mLBʖg8ھdiybJWpJQ+? 9f;oϵVf19BzkC?d4w]82k]ʜ.QYJO~qr]l[SӃbsb$C胣!{9=5Y3;~f2" !1W%`<"ӅsIzrX:K4ei' WQ_NxND B_Kp+MC9f57;.}.a1M@=S}.BNfhL^c[!Mތ8-< T̥޶uH\foC~j ;r I0۱˓&A$Db5>̀@>C7B'*.z/ ڔe.Yl ^w'AgK-o^v&[y`I Q(DJ,;OfΕUXF I28ԹyR"O@]|?zʷlN!һGNdH>@d ҧ#|6֕J^YI\ i%#X r"䡒%eG1*֞KI>hbT)eYOSFQ'ӕ`6Λ/ T (, u@  PHȎ'Q/Z$ܪP̋XX; 1y3򌨆ݫw[vuTSl@ڻq}Κl- \yi=YjepqyAǍ||I?rώ#-_ >c UVZIl:xNVOP{B٧mPm;|A7{1"Xi eg ?e% ;;(@GCk-cSʑ }}_nniO۠,gm/۬(U ~lRn[7z~}Vw},_e?Ts"/!.W@B]S0NCה-{wN/fPɔe@~6) 8DĖ}ĸ:4b܍$.vK )\6stYu%@g?Tz*ssQ{pq7GK!Z-an2K(6DA@GcM8pBV:0 2/5xyX~n3@X o(F$߲;K%們*.7"XC;t"@ϕ&ȱj<^#? ˔+|>3 ժi/1SGC~#ӎ`CnѷI-6DAsHjΩxf漸`:9g d;R7wPs}&pe%oP#z>DU(2_J `Y݈8] 9\w),wTkxo4nSElj&sjv+ì\X 7Ws#6(tDcr&uD$F׷YIeL,?Hnh% )}!(ֱLP{l_?EUgtg)U&ϥ,>:v!=cMaF\ b=܉u<]@+jZo)]0b3)Tr {l@ ߵj@ktU0UcfJ,M] &Aՙ %YqpNkM_Z-NgpDr}=A[?`hnXpwSu瀩Sl5bED\QXX_hm!c`ALޠI>@htT0jׄYakr@oދtM+:4+<[I:ExmGS9?B(b)|фjɭ4.Ĩ.^I%"f˧)"lŇb9,3rt3g[kpYOs{lHtZ#s#NtFEܰ~P7)Ky`en- /H9"P8dk}$b Ney۝ hcKY8妲nAx.y 3ۊڔi6ț.a)$,Vn1T[{Yy-ƅ0O۵_E2ʼny׬t)A{\~\tF4e ymjgS' a$ NXFK~j4KH2.U/zZu엡{im5сvjd<'/pX$6'%eɶUp|0q.7VFha(5m Q'z&C=- =-D^`,Tɲc=;Ƴ^;U!(_'11+473#"ЪV~<'!ЮyA*##F/K: zVݣƖM1O *A#9a: c&:V i׾Ǖ) `ĈN/6Tt3BV]~YY$Ǚ+Z>235"ڦ*Vę]+@(M ۋd}عR˅ }(IrfPpDD%gȵ'фer֥iZT@P(l|D1/7OSItOq-T*ėft)lP~ @s8%n˳>FQwiz"6:SD OB@B xsC`o) ,9ox%%W(`MT1g('WmJy:یϱ'EQΨ%t݋F66Ex?oA[39s )+D2a$U+oXߜ?}KtJu'UfL^Y:5P (EG)Ue!٨EUYy(&RP.xh &ɻ\`Y&$#AZn дOZz@J4ځϐm`Hdh|P8Ÿ/t` t]*y:?*z[nJ<Ld}/B~ZWfJgF H(]ҤL2UWB`m97 !@c`_-Ix 9`~:yՅ|9rkraUqNW˼WM׮R9ԗO)I%ЇEL CKSP **<#n,@?ue>P%p-Cv%9-] O}J…u?H` aTMcSˮ~y9QG` :Zҡ{: _1'#7VH\oLTxПW=֣>ս2$ItthDap D?rb}(ʗ1˄*Ѣ=E"?5x^A-=/mXSI} !-IaGsvʰgNl[%!M@{Eaiz)4W'07 :߬C/69n%3XjsB<{LӲ feAhv啱N?P2=ec@EETJ;DfGhj0I3ҍYwYcA^ޱ94I$.Fˡjy,-HږajjRhPvzThZ9_( 1%yXBF9RӓH)=0I!^>)|)d=|ZD"Ib4 vh*drRX8 ӍG沅 mXdgg> #`1@ٚ<% i@+}N[ -k ؇۬:L6# G! +h g}cqDTۄɂk>wuHQ_0Ê|eR@MVQ $]Emħ|rRHD%[4*̇8+Ϲ$ff(A5U !(ƌo _}njD)Ww< .Xud4ekAA$j1^ £& JEtAL!B4Ѐ!)웃eEV"8KFӽA|$ kF- urS 8L/ߘ;ۥ6 p6Utҷ!\g;)n8*Z^rXb7 YD2\3ހidLdlM#Snbh /KϽDt˪Rr<?'ARW r΋cW{Q^N5f̕!C1=;1$n@쌄lmXQKFAD¦{yW:,)2ؿ= qIs;Z6 83,Kj1`sC'Ado6_  gJiR#pLb˞@d$(PvBZ3Z邪}X $$r(UWwZUO45k= gym6 y 2 B宴*`N5#Snho@iXU6XMLȓת!L}kw(n:1`!s32m[\mXy*/2/oٛD-IUP^bAITتu0~J0{qh͗*>쩨rQz!{ B0^C,U$jyt0nS3>`00|v˯*Gp~wl*y DJ`67] iPDƞ`2ӸKHsB2טQAkQʲ [/$cbGoc,p'zytӝ&[^ġƃ# Ɨ;71lTh /$8{K"guD;gG0pDdBՉVlJba.S sGC I$AN\wWi^S~i}~wR\@sHH_2I͖m_bd_CB,]Po g~8`$b.-d8]ö0࢙xU)tAhHF⒈O#΀iE*4cN:* rW.<n` ea20,Ak0!AW6)-O5R}"|:v>eKqظf'.yIMQu+J@q s<]t ' J^Ҙè#NިE~b6V?} glDKKPjy+7 @K"Ad* N'emTg"@KB:G.1k#g!,0k&pU`e@_>Yj!^b0$8<]-`#136)*).~(RG=[)}ߟؤ=kjP=Ӯ9~82y?b9d@ *7Ŧ~)3lƹ2̈́S : ?8Da@h9#=C!$X/[{:kltʹM<־KWB<۶~v=vS2,ݨ́`^#EyKNO=\4|dނhS,dQ:7b&ũ9qMb|q,tϑ|eh`, p*݈]*-#:tuX&)$DspFd$`lYxMbe!DA{Q>q V|!ut܅y4n}s8As֧9phBLU >XD1wőv]Ja?eB]"|r2)u'e{׆& F,F# T3&u\+NOE03MwVE7>5GoԓFΑ՝Dm aTLD74}o1E`ROۓ):5̏[6TЭb3zpuj6]w; I`h+3ޕy|kf\`2iQm!8IC.8R6(;7 OQp4hGDZ X5MkkQ/c/K쥹,X\M?B$OblWg)+]M_E(/Q41KnɄ<&KM(F䱲0TftDY@۔X p7Pףvņ ŒnVrwO@Ye o uz}j^"^4ɘmmOk0yIu!yф;O>L.ݪNϽ}/ݝ8jPM8^- 8_z=uh\sƬ7ߙu ,qŁprN)ދȲퟭAg;6f/dk>̌Ň*aMF?Dc2=P]l|22=OUC H|:cPvӤJ@U1jy59QNJZUCs ݊hKZ8 ++RXO9ں6Ykޗۗ%zƝŭnJu?ˠID# `7Ctq]qcyQOq ao, 9z)Fu*bu+F.f"UaV^*$'~! !^R!8Q)o6gx:ƅttt9Jl+F4wouzu#+яby# (37Ii -("_46[48*0W=Xn)лFq:V2 <.\FնmZb&L܃~7H\(kidHgϵDPܙ_cp6.r݆15Ln\͎* a4&eB=yi'#=uD?: SqGV+ GFhl#9?Xz&pvjNvl#}-sx"45B0?C9^cE^O9)^)NN;P x~@ c5(2c[1\|G߇/9XYN{ TsqB(`{֖6cfU0z)jLlTbI%)@gңI]JP1eȋ( |}ZƘI\aµUD.27_3[,}2rfпh%S,nw.{ ?,Snvr7j݌1A '^22܈FǑrXz`@n_G2kƧr`""1$<᳒cg0Cbz~,NNi3ҚW( VXV"VF;.ɵ#-`W4@h͛Nax w"VKl+Ww8bU$ Է1٦-`,jPesw:`DTGXr_ObR#G]|E_hq{XYA׋{k@']8uG0`^׷iJwi>H!C F]7# : ROf7Qsd_%8f_)~ ) &+=\qk*V/{煓h%vO0~}UD-L3E륲$rP4pi߈W1&n|n\9 vC} ˆ36jo'S7fK2,@_RCx`@ͽDUDS"kk!:z I=藓Fs>QʈogqI}i*0d7 kQvQVԉ<)CcPxtv1[j;Q[GVG/*گi?_2iLF5o;0 > \:|턻`v$„bc% Vx32 vS];[K=h`-uCMXD+Җ/b+} }-XթJ3mkO1/K2%h+/(ɸAR,Mf㌤ƹxT{N![GD.H^JE]8ls @rP猧ˬ4ie0XO?̵]`QNDQf D YiPSoѦVFu+}| dMOvc9V %#,7чm!W'sRf$RDX͸,9cO#d-z\N,KMO$Oy ~2Jhm.!nHe5sLȾEX{F!*7VO{\Zg^8!+q(Clڻ7%UˢW|jqB0)/GLBuU6SkV*`t tʮ/2),/]fX.:(;)5앉3 QS,sjxE^ L%`̓=5+B4s6i>2'XZ9bUB9H!GI1*=C'\o'竵8Qw"&?N[H*eBuH kAT@/ .,[Y"M'#нdIA(r܃0眈]h3¸EϘA,vwƔ~v8b-F e+-t09 8>$/vngyL.ɨ 05dLC#C`d._-E͢^<\P~T~z6 {Ր ΀Iw}ƙ !%:]y? IUgbg ~\5B%,,72)n.q;.|ڿ0ޭ]V~kˤۻU#| W'P9{PS014Z~~U[Ui~vvƊ@jhO6!uGg| ?띰"ӀW.oNG7`ΡutQnohT/0۰Zl8U&NMUĤAà\6m=%[ꨰ&U4_K3dzKgDJR1񃣛cȑ3&j/\0]68 b@jLSw찓gF7l)=50K[Q[Р>M4Ҏ,8JUd'}ӌ(pGjUI24TVچ_sy_XW0ĚWQHN=_3 l\A%YABNK[fyNr}T4e}>ME1315#zz?bdmz;lkLhS&Gl?"B&WEf - #l(͋ lQNI~?u T'a>pP'5BZNPP(pچt MCJEHu#/ui9S~ 0F5z 9F͸-Ɉ..?#Рk l:xL4a]hbV;p<2YD3'/ .QD-U#h,۰0k]4n0*tk2Yjo֐1ة~R6sGFQB*p?-}9&Z*x􉌟5mzo2fCp J^NĨF$MӧptU Z^w~*Hl <{lF]9(2=gxɑ9hGrCnR}<+k)$@ˁܔ%߇c-ԬvbOnx 3N[j-* n<|@ ]CcS2t"|PrPL/yD w kRCCUAPȆ9!z\ve}ae0цL$L/ `5C廄2701a/72n=F֝P-_ʽlbڱ#?V 0 }-Q3u٫3y7"aǶ`Mt8pNXUe6}8/Us_lǣp>;jlb#Hwק!aEM)h$t%vC)҅N86=EL ݯ8Mp]WU${9u )pZs<[3EXkbғ A{Ey0*TpI=YIV-9H(5&"c*ҩ @&~漚KyЦ-XU!AUZϖ@b˙?,*^ 2.`o}0,< JS:6p';KfԸ=pA!ah2]9,Ax0#( D*1);($aݱ~tf]v%, ;ǸH99Ja 0!ԗ:sE}@*QKp*جOj ^Bf8ޢ$b*z7Aw[n~Di?ŒTfoC7t_mmnwKMmt;},_e?Tr;NKA e(*3:!JVbM+3B`?6Z$ۆK/B CRyv2*HicH/&Ca0ץ4'/EOrV께Nd_ 3tAs\2|2ַ-?#`~w-kEYnE5YL.>R!ك8mo`&; =T #MGu$:FQ /mK*ɛg/*Q5K[>Z1l4UNQW.c\fn8A}rܩݪiQH o RT?d``K%R+' `_ա7_Z0@oދt*ߥ$`篘 ?^25 NUHl l>yLF5i@`Ȗ"NE sU2-/oàAӹ48\b2شK]oܱ2{\5e{BK*g2Y8 wjMۙ7ލl =W4pə_LLBFMm!{F?S\)Y$.$Yezg{Q^h&=-%Z) }}'s$Tm%z$WljIۑTۢA^+v"q,'ke3*URzFn7UrqXao1b`LթQ7!?EBX5%T%s_k5ɂsV(90;eM]wKÓ׳v׬,QV&iֱV@3]j߶MZ*ˈV`&7w;X'~MG ZiLY+[.T#sEWxS}^2d%,$M=N ^WN?aYd% wQf 1xb@_9vTZ gZڇ+{vڒaYk=rP UXРO!0qF+P`R{{6#[) }&Y)^- :x2}n|0xk]R@ȇ;QQ c׮%䏀4s2W'V+.QU]u8 ]!,?(#s/ UGRx4nUۣ<=Tvֶdp5ywsZ!ϬuBSa_Ttg[aͥY~A6(PcH͉\ )Ab{7S3tk#J0\I`"wvynFH<=R<꼬H(*(Դ2y{ǥn?}KtJu'UfL^Y:5P (EG)Ue!٨EUYy(&RP.xh &ɻ\`Y&$#AZn дOZz@J4ځϐm`Hdh|P8Ÿ/t` t]*y:?*z[nJ<Ld}/B~ZWfJgF H(]ҤL2UWB`m97 !@c`_-Ix 9`~:yՅ|9rkraUqNW˼WM׮R9ԗO)I%ЇEL CKSP **<#n,@?ue>P%p-Cv%9-] O}J…u?H` aTMcSˮ~y9QG` :Zҡ{: _1'#7VH\oLTxПW=֣>ս2$ItthDap D?rb}(ʗ1˄*Ѣ=E"?5x^A-=/mXSI} !-IaGsvʰgNl[%!M@{Eaiz)4W'07 :߬C/69n%3XjsB<{LӲ feAhv啱N?1m-.,#c1V#zJcXUc3`oZ@&eEkt}ԿE "op+yԲ4NJ 6$4t<(0V.Ty(R?g8OԕB&|eD2ZF=EW2=QsÃ,6g#{k!?d?J L{adr@l^Là(PK- N!KmtJ]48:SXy7׵ Ž+Zs˦ ;T}+8|j^ڶ 4'vDz: [+zSc{5HT -7xڜf?VK˃|>utOS/-bky6 (%3f~Yݓbk.C)yRWTߺjP T;{;VM@]S8dcڞ"ׯpE;EmϚWϾHR)YIQEB%lftC%L"B:4V_\<+c# _H|7E owʥ:#k]SShnO!4Dhˀ@Z D:2M5KCw%UX0d~նtR24ȴ2fiU gnU*E.0!G ^N9g TI F'/H|;fTa<b'݃'}#l @X707ZKOj~M1yP?GiRa maSת/sE#w輾NKo>{9B90v;˪[::YҶG)>}CB_7"[ؖs Hve2:ޜlw¤%?.H}vVg^JR2ڗT0!c3V9E $ a1ehB4nSu5*N!Bbjc=`ݿ4&lǓNƭdb%hx0Oz!O?k*m]V*FEc#{hϣ l ?IK"P!]^Lڐ"Ƹc> HhEt ٌ.qZ3vy_9Bo3qm㔅@v8.fvFKV& v)~oT|l^Cb"NȬ_H߆ _QM_2%y;#0]wDíʙF)!6YnL<$7xBwgJɪRUȐN鋫Z_PH8IYa&@ 8% -c"V~{CL=:G uX?SrXcyY!I 3Bt=*5/xUu4݇l/ʌ?a%NВ?*oNmgB<ҌB78{qo䯸8}t+^i<~j ĄZhvjޤHpz, ҫOޟ $Q췫y|_VdI/;/ܣ[TCE?r_Okک^`M@H  I=zntwC=A {3@b!ޟCˠZ2%N<"g[sG Z?*`N5#Snho@i@2rv[aYZ!B\-2yM:fC`'IS2K, 3݆~t$aC`}۩<6Ib+t5qV-_Ҽ?IsYڎ~ IҐ6> ) , (˵M:O/{&x#S^nba.SFmЬ u+mYg&F]`:F)AلadӃtlMbD3#+bdDW{2|x)ǹv'/#G5p]>ߪv'Q3dlN&&ڃ#/B.5b2h*DA/CNJ$!1bh`{۔L2u1hh&ۄW>EaRPJdUs}\ylU'ԌḍDO(@Hqml|(W֣}Pn}hVf&Ꮾ(8ʴ엹z(^;, lt~. ﹍Dr>p. 4138!LpQ 5lEAh,&MnEvи 2#:U=䒖Qe+W|44tG&ݰFhE ֋eܱbK(@G7?Fo[!Yz>Gf%Щ*YCON,n#bLQϯE$Bb:9<׶0J}Vmدݭ6è#Mgy[/(0T:,e͐llz޹So_3Gy)t2VgL=;Pak+؆%X+m 8,[eWjR)2ZqfgrQt4!WFo!2R$iz2>Ȝ WT6(C.!<쳣EX?cd80u=~nyP g+"I\9;tax qKexۭO?fZiiY5̵Qg4׿.ieA>)|#_˥1Xo!|4e7fENu-FN)d昧57sz{Ep*/O~@ 쨎] oZլ1U]\!'U.(KUd SXyNnz$VIaSq,T;Y^EhoUc8=Jr<pka-}֡?S.>z7 2/Hw"{KmAUe,$a{|A>_7P8'ӇӼRI}&4e ]tUa}dE+ad/Oe0wvH(L!Nx5kzi,D\sO[fˈHv9 [$`H <'ޛn)eԧْU=̅F˹Z566K_!h!/Do#1+?wQS9/{yLeHd tN1I4F/9>DKKPjy+7 @K"Ad* N'emTg"@KB:G.1k#g!,0k&pU`e@_>Yj!^b0$8<]-`#136)*).~(RG=[)}ߟؤ=kjP=Ӯ9~82y?b9d@ *7Ŧ~)3lƹ2̈́S : ?8Da@h9#=C!$X/[{:kltʹM<־KWB<۶~v=vS2,ݨ́`^#EyKNO=\4|dނhS,dQ:7b&ũ9qMb|q,tϑ|eh`, p*݈]*-#:tuX&)$DspFd$`lYxMbe!DA{Q>q V|!ut܅y4n}s8As֧9phBLU >XD1wővTW>VsCmsڈ CSNK&{ջ.-"GA=j nv"g1ؚJ5tvӕy@W`uH}qs58 )IU7-*nSI03jෙl _CHqcR$^C01}F|J sΜgE~c+P睔fhBWCryE6fGٟbPq{6Z=4J]ԯ֔.źMh=f0&&nW5Jv2LQav̅Xj \E񸤴 G oF%Akމ`}73[ߵ!/!Y5~CXt"9䌂᎒u:>_o8;H} pd$afWmI(uYbO':4 7SMFҲTY SS:L|vD/Sф缳ṇJЅy0/!@&2Eu7eBtǐE8IJvn!DDy.˟4Oz>8i/V̈́?t {᳣eRmIKa Ôj}1eFEFEޣ!5:1_6um5űP>X4 }ɭT&E9IVt rj=٤[A?Hx H.b.DםBGksks <[=m6(d*m- P~W\|O κL>C$x@ Σ'r1cF Z}"נLAzHZZI~YE:`+? %G[ZD_m68dE*ĮsI198!@1׷iJwi>H!C F]7pi--/ǷTפxCG'58q3mMPڳUnK*zer"~>$r+R=$ ĒqO' wK*1y>%7r0sQ#Wo+@k)>fn3KqAX忰[cѾgdv܍H+2h:}`+g]k4T9}rǓHtXq=Q{pFp!Q;*bFwي*{ErB>Y8r)Ӻpdq~ɽNDlޚhB/oLsTuONu[.j>%X9Q__4ìqA%$.:̫5X#Ǧ}[ Z#ɩBe3)Yn vѽL©Q^ffxSoSr K}sF%-@e5sLȾE@E#w2sx>jvKtFQbrqg'*Yje`Әjd&zJ3N磁ꙫԚ;n#&9,*s)9=iTxl[9 k2.p}0gaP6cށ12s22'/O쾵IQs>>=W&IE6g"+!%[@!HK,9-oA4DIXM0xr|Y{we^47wrd gٮpK*8W xsB&`~h/6gԵ1r6Z)| ,p*|DMk3:^p8_#csgBzF]@jG"Eti-40#->\5B%,,72)n.q;.|ڿ0ޭ]V~kˤۻU#| W'P9{PS014Z~~U[Ui~vvƊ@jhO6!uGg| ?띰"ӀW.oNG7`ΡutQnohT/0۰Zl8U&NMUĤAà\6m=%[ꨰ&U4_K3dzKgDJR1񃣛cȑ3&j/\0]68 b@jLSw찓gF7l)=50K[Q[Р>M4Ҏ,8JUd'}ӌ(pGjUI24TVچ_sy_XW0ĚWQHN=_3 l\A%YABNK[fyNr}T4e}>ME1315#zz?bdmz;lkLhS&Gl?"B&WEf - #l(͋ lQNI~?u T'a>pP'5BZNPP(pچt MCJEHu#/ui9S~ 0F5z 9F͸-UwmW@-FAc!b"n`L&?^WḼ-Êx_U[̎><5;itS\<3y9xh.I^ i5K:ï ?Qmj Udç[d!FXG 7s=LUD"tlЀ8?@DOѲ ޝ<+!vSPUJzZ@nh4[ ^{5mN3T/p|Ac4?4'R]w'mT{ib2J:d" ]}a*KZ.R%9$>N{]BrGS1]ˀI%fcB.(`$jsmSb?/HEzfVIYr}Hz 1'4YTQA7{D9ZQi( \ HugFnwoeڐ1denNye'< ,/ wuet`EiD=vtQf]뫃4bjC(0_iF wG?9^Or-]jUXw`r[#oj`0؃6Eni ]m/ZS?uߕW^yN5 Z3p(1™e֬5\V1?b3sdd.B$E8ìR%v<>LsZޠk}-:vjN䜆NⴥÕ }FnņvC'f;JZMpc"u3uakX&?fOs-ojuIh*%|,%F/MFV1O(5o@0 m|7|7F/MFV1O(5o@0 m|7|7FϊnTmmpPP8Bte@ :ǓYή;!=he1a3twK 3_ ,z|(M.ݱrBKԗ[QR.ŵ3/0ݑ1O8 JVQ 5BE6$Rw ?N43s? Zjv !UCNze'#SY 婁Hi~Տ1e"7ќEÅ,4J}[i0]ۛOj:V´_0MZ=gxԐ0n,REueuY%u.=!b#-U> ySr|)/PYs.Ӊ1LZ g[%/꺡lnM#UN-@ $" B_N-@ $" B_˺kۉT} Wr[(|@!ʽqus=dAȉT&0 %6ޮ=T|9Nx7t@bc>\v?#ۗ~@+1E$&]Ff mVG[^>#?LkIӼjOYpTvH=Z2Ddc+- :S]@:/Za!/5:/Za!/5S\ǑYE|UI`/Ѱ͝F=ԗԸ2D5RBHv0Lq?နo5Ӏ@;EB!$lX}.Q"N }!X.@KWƕ5*4~J5-NM|[ƃ(h=VK/. Čq&X[6ҫk,B966H 8UШ/[׏GX_; bwd 7ЀRɢAhMf՛X=kK KcjH&5=[A׀UY\_ F_iq5M`K'fփZY~ #b쬾mz aA%zzZ?kyF#!&1I_UDJ-Desktop-Client-0.6.4/icons/udjlauncher256x256.png0000664000175000017500000003606012051252546021432 0ustar kurtiskurtisPNG  IHDR\rfsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org< IDATxyյWfcwP@1`745K4jE4c}ߌf<43`(*D@Vaf^~tLw tuUwO}XԽ{PU da qe,,1Xbc qe,,1Lv&(VˀQ9d9֨zj3p'C^&,,, !(θA]>Iv`CoH'PSU@2jSED9 ' +.BX+ܫe 0W3yIIobjňh"݈ /~I>-S"iյ 7YXXdiյ ]M NH?bƻњŜ*E&p:m`ѹ,ZuTY lF&tydQ\avaaaq+I:6?<aiEV#bWӊ׿EH~PQtEW "q'`L*H~׏4Џ@qzP\Aq@V6"hUW M؏=#u" #H~$M FqzH>|L'P^jsX`a;ނ7q4RGAQDU0E8&\⯑$ՃF_3 V'E0Z08}o޷׾-;)`o?0x:PVoxgw JMrAO5,O?ҀMmo FE҄f 6< @jroRg) `MEw'o+l ҈WGu[pK/;s)Hl4k `$#soy9"cy-*,U.tEX# #ww~s8k8!wwPҟ)zOwE.Pa٢+zq BI%l78K=@ɚ_{j-Y$EO@h#m^PBfՈPמ$- #PYoX9e҄yXkY7=O:5+'f9)q4Cų#,FFU{E򶮣 :/ 04k`5pߌʳUųc=]ѽJ:WŝoT94MS=%Q _~7q⃷ӷTSqFJ\-ʸB9N#_#9 TM6[1eR@}?[ WD(h8%# Tzz0܄j׌`MSW8f(#"@HRBUQ\0"?yEگ S-RZEU)|y(|B$ Yd!IÔXBQPdg;ǨmtUJ` =U\{0[lv;ÁfCsM)= ,ŵ {7|')߇~TFflK0PEδ!$I8pz ĜU\5( Ek~sv29AOod(w7=X i?[n !+.z4pxW<=aJJjj"N8E'FcF)}ھ( z|(!+P2`Hҋ4m )7Ү*&Ov6:OPu7> 7x{{vw3ߟVsU@+7lzq9p47_4DŤIO0tCŠ0W`N==k6J|yfKq]ByWZo8\.jf•7t2FO9F~Z[;qPp m=C_E۝"X=lqǏQ~gGaEӧ#2P~D?':>'zg?K]*prqcN5- IjTJkjG"z9~=Ǐ~JwB/6[0. (]؎LK9sp\y?@OGflR˻h0 tHAppp8WNҶ "l'5MM:bg k3:С=Hp2(,Cy fӜwz kvay9nA}޴g:k83/ݖ_" ঵vöaפo3ۧ4c)5}d)aE6`ܾt#vNЮ]4nn)S:Aˏ>݋ݞV@rx3 P{~r&ΛRdH0q{NWkz!3D B65EfY9*zdn_$T[oѸc;7?J^ jBv?'77S)~RYq?sv ۷[o1NџC`uI#NMDad}OE 3(8q힠BpؤBаm9SjG*A*JDad9 rjk:5`)T}7`,ܻ hu$M8WB__z'9Kc?IO0:ΚCy!PAv Ǜ3Z"<Kϥ}y"{CB* \%5!w^^q1s}9~}>v ]]a]]y?=+>}J{`[(C؝H3<nAxFNsEOs h;rjX{IkJ〼we58)s|{q>}) VMcWb>U5,$&Ιd1xF[%~r`7kpnX{N;-#!uנ l^~U)FYINL?O"="TWxEgφ ֛R/)?ɒvaܯ>}ܐ.US+zĖNoE"uf1kD0@?Ӗ~YW_UUP[{![]1#5%Ř5k: i3rэD(ڵ6cHmư/@c>Æ\yyUVD_U:|,{p} qRo09hkllQ7g53f`w:֏s0q4GVzn6Mz15pmx FsܘHCBP=m '!1;2IIJvIS=}:vV=cH' Y+)*O@ۡCK'2eѢ{Oa:RX/)/){Ŵe˨5mh?|8~r  L]hL蝆Li0FW~>6"+}LvO-]JaEňjm!: Y=q'8s'ʸ܅9ؿiӸvm|E> 0&҂fmF"Gx bQ_(Dc3zf._ BOG [Uf__G޽Oŋ)(/TYXQ .` Y;z#wڴD_c`_2{GhuY¤ 4no=y[{z,\7l6f\gNWb"| 唌 |9m G}ǎY-lZ`w|oq0UӦq#njN&͟O^Q{6l@+7 ! =R}۝;0Hp}8={07~,[wޡ瞋;(Qey}= e4ǞM BmC{Jj9M=폞dς]6V S--l}٬QX쳜hi;_R‚U4G"uDCٿq,w} !97(~\_gnBsNܛȞ=Zod&k:wޝϜs =݀zݬ~9\#C`Vt)& T:e˘QU[o8cZ=\0yi9pٚkOf $<@ f G]oGEJp? շKĝk;xoeD9[<wn%W`f  ؼN42c>;g+ȽǏwd26B+ƍSбgwhל]PKT |Y 1YP^~9.tR?oRep^*:O}#A(DDϺ+/3N*s@?ׯs ̜ :UX("bJl?sQ A3uo…H1aɭtf2ϒ$1yA;#go6ԝODB B@3%%TN2YUW0VZ9^iӨ"kkiQg /Л%۩4iptV9e MocQ*jcDv7Ҩo~"@Sԧ,^y>Μ7|sEg\C0k׿]y}}}4GY,^u #[ ;;өw d;ST/zs(VQUŷ|:^=nի)]JiTW/kf6@YkbJ¿fQ1iRûwVb|%<\q5qH\㯾ʂT pxs\È4"k Ԣ6pC`euuqx }kWTUsqUW^wM[4!(sI>a?IJ0p1GMMړe>(EEI"~裺 Mwyg:E_D%x/-ݭU_ϴٳ4fՆ;.Z~iiܴ(gZ*o<;:t]{6R{ťSa{.WҸ ZA[WgKPTTUqU#LY mg wG;^\~3N\"[,5;08].>|"矯kq||0,#phf-X-|.]{8#;C֣槚+SIYާr7YdC.qur, dm0 [4<H|؁Ă&޾>ؑFEe5YLgVkiF}|nb>׭c &߿VƓg:K @vZK#0:e3̾ǗgZn+ŒQ ~n Ng]mB[K <6{.C+s=Y:t&(D~ַt [t*lwOYLg m.,?+Zma]m |sztVPktl&1FQ@(kKW;\CHg71^Ec҅R^3dP>o0I|&NquV̓ xw>m%~g3 !IHbQw W-F=q"n[X^nF^|x܍7ڋ/nvSX^>v,#I"rD6900JdEH+oS i纋.2teDIDAT.guz$~W,)d`!g9k Zg.2PN3nNh޻wY2d8=\7n޻ЩN*]C0V(j@#4{ί768kqv}/R+f IbЮ]&JјO (:27f/3(sƇqRf._nT0s]ԙU/NgDS~Iҕnp|pp:[Z8^1i5I"L;Ik6o6}ן$I8O῞$Nwb M_ly>y'ܔ $US2e¸sC., ']# gBPƉ ʁMqQDy P&5M 60Hʜ35 mZ;gEQ=}zVL TO.˱!]5~򊋑=#EPheΙ I,lLA ٽ~=w;/lL_%^JyySYrL_lX;w{z]kF"$<%3EiFY $ wv2srEs2gJz::hغ5yF'L`PT ٻam #) Ob.-I(MWpaN5(6e ْFۡCx{zt)ْ XJCt45fˣQ*t&S7(7SGRs~?.*3B.[:kcPξl\;Զ]KĉLYhX6J*+d 'Nq0MM)+d~I euuMH~IɨyiضÇS'ݔO'fGwvO92mdc/BE1[i(vi/X#&>J~I %%LZ@?^/~?~wNvxp8nO\H}>bo$KKÆ2q; ԊZ <3})S-FV*ñ̡fƌQS]..F[ мoMw뎕O',SQ_#QUE ϱ%v}*g_LHap,0P0;8s'yz]b#xiojv}{3Dy}=6sy2dR9RDk{ZO~ A:u@%sU6n]XHYm-euuk uvDǑ#x LAY%UUg_PU.VPԩ OJ )@袏c#vwMSd$y~pFX@g6v3#(~VC2>L3 tjdFES(^| { r !AF|ttWtv2͘CH.RXd)US)*FG4MM3B}lN5YpC=ԊڔEnRX^NŤIr￧Ð)K$3YrMfKaE?dŇat\zcʊQK2>"q\L[q7>B-*E-DYqvblv՟0[ L?puĹ>}Fö(+?6/R4I}^ EwY$YfYg.(y1ovvM{uo2v58>#I w&,r!ӗ-th?˸|>o ʇԟdI_cw AY-EĴe(pd!mɘ7r}c k fciwUXϜɡF0 NŰH36}/&%tػZDYu 醵g&c2hCVs#th_? G~VU5l";h;x8AJ*QՐg6YvNp|$ Q%|D=1ǎ^Hghf;PϼuK!˔0s;5#gûw*:L3/2M_) =^Ĥl,(U#ED ?[F>ɒvh@O}LGK Ya{CɨАG#wn5 ,Cc] V.Ի@|:hNpbt$QTQAqu5v3t>0~L_1v%Fe`N>EQ]ov$G^/mE*m$,:n&^P  Q$aw:qDʍ۝NKCej1P@@UQt E礷,Fȁ @< . ~*H$v;v[By}{>auvrP /hw nXO/Γ_TPV#(KW!> ]83TQTȿQE{à4p0iN>'ZZ2Wԝ0gYfs`맸fvZEݽZ ?@aْlH6ݎv;͆)`#1F6܄% UEKkc#GϜ_Xo'@82\B)_y*eS#<#lUAC)Sv -W^Q `rg@iW />;Qwm0[;^^;?/g`&{# -Gc)Y>ĒA/(<5<+'~cj"$m?]8 d Ɉ~O+ۑ'`4VAg0d#yc|B! ϗ5SQ\;1{O>ppi(sD%BJA@d),EӿF?Ͻ)AlQķ}+ࠇ?*$C쓺k,B >p3%(t5["cf׍}j08l#fZ0>u:/K74%0Lf , quHWf%AOǀk4 q>v7w@d`bdycw[ʟ"@S0O<=0[AQ5Xqْy@ +.C:\3{NlAV҇>A=Y@6="]ܫQuqi-t 󑮾1iY5vҷk#'@%+jțw;?=uӷs-N~%ʪɛYFL|< 筄#"$Y"]~ ~$YazLҷk#(^uaw`W}ghWxm~mvM?E$ݶ?B婇P_{J?,xeHߌb49P(4kxϧV ٲ7_l T]H)z~o/GM? 2^k\yI% }ۨW݆Ayo4gSLc#J;"eHz\n.ޭ"Ю1ϻӳ%>jݶ>o}柭vQY_A6)Tr1bt#W-ΘGr^JO,y:{6GySw)9]~[xR{)c(@&nB=eS(:u5(.GzϥH+/{EW6 ÷h T懾HWԞ#8oԯ~E+qLr3b,I?v7 ` G8]HKW!brd%IjQ9Qw)U ;QW{iLڟF*4nc9ֿD V /XG:[Gc6 Q71,ܳ ."xG~7=%EQHg@moC{QP6|$#*jՓ5S3sDdV ]hL :]עqKӽy%;6>o~x}(m}"k2dzP 46zzN#+/\z24DOga26~ a{sikó3#bw !NRRUE/l}w^XyWc#ns{r}46f߷?$d1fIZWW``w:Z:VuO90bLj1Cv8׏ZCf90uUH9 $#I%, 2l"θ~-,L&i]bZ0E ӿl/JXB.Jjhn=u5)6. hN{rݓf 7q0hvi]Zzx gJV]}-8>,,Dj4TR64 <-]5ߢ#9i kaf/ OE.{E USSwZ^VPu#NN:>hd X|>tt WP:~/b Y:ݺ6d ZapB?1tH.{ 92گ0TZXdͺv=QR=!q"n*57'cB1YXnj" bWq'ngU=ӿ_|~_{{yu:*j,t`!DX'5#Rz#Ln=KR.ȯB?龲 >JIS 7Wޜʍ)36Rj 㿢ͣyg2(\|.n^DZoQ I&oR%үoY]ۛ)3l tѻ5J+Ppl?FgC ~ Nla-kRm@8dI! qB`%5/iDwڗ~X ի` ʒgO-,,NQ͗ԼaDc%~lTql`|I`p7\\ujED ð)@"Ki.R+ka1?jsƒ6e3U+X'#'OKj i7,yX ,j"Gu䰪LX'zG 'll&c *ba1 82XXc,`a1 824xIENDB`UDJ-Desktop-Client-0.6.4/icons/udjlauncher128x128.png0000664000175000017500000001641212051252546021425 0ustar kurtiskurtisPNG  IHDR>asBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx{|U՝k}'@ /yR#^>С:jԹի֎CsLέ|:w3Z?vlGJ J}AL ^yNr{?9@y<0_>cgYu~뷄 >(c] Ɩ)g|R}AQjePrM%]w8Z'Ѓh:Ngb.W1eZq!ϔMԀmu;ZV8Z3%X| W1Xĥ+k`G-cI+xh6>e W{;(y؛R~W( yyQR:_u tPwE>`CLv]R`  b?˓A+37amxfkkeBvRy3翟;Nr^oTx0I^d7@0`_CSk`F)7 uL$ƳX-'dVUQ8y2@`Wz_{;==UQ“KhLeyg%U5 #|%BCCtƱ>r3~;? EQp?\_(xڲ.?cݗyV&<?pFߵ"s0`ň08t:"KQ0)aw8>ڙPWRbB})  s\F`s8p!eQknO3p{Gqy9*,`ܹ:r c|G;w1VLvKRq23g&ϜɬZ4 =X]gc8wMˣ 6og=䓌o4?z zC+Ku3hSP`hJB?8~_AUM #)[{{9V_ϩ#Ghe]Oa!M~x`?>L/@CfCuݴ 0t3gW( V||B v>H,08|;ϟςUFh+sB(hmɸ"ȱG 5zXz(Ye-t4-߲o/̪S>v Ȍ"h׃%+FߙjVW~,zz߾S)x5 z0- F0{qN*jÂ7tPZ2\yy̮EwN`_wDkk^Vf|[Ɗϊfuq?Bz0 毪A( uui#BUMMDurzVGR8mB-)؟_RBIECI[57¥KY4lػ{r.q8q 1IkD8s .KTA 0@qyyx}}|S|O;R HHN8=(0`_ޢ"cXv H ؽsgxNoQ}}wuT1xMK!84z"xQ*,Iw뫯~ri MX|9[_}5az<#e-6fC8L:}4,nA|ie%'#sظaNy0A԰oLr2-*ω4Vr;6Iᤨl)[QGFiE/ qꫮh֤v~]RSQU ciavTMz95 =lyFƒk>>zv򊋩^W e|'Kss2d< oEgrUUV-t/\*~?z+-w5͆펎" )zۨ,ɬAƽKh!"Cש\˗gPf/_N%mp-.6?ן:Xz}_ufA1cY@o{;u۶vsxtp,^sn6ztx<xB $P)ˮD+- 2~ɘ>9F;Ǿ-[ꢠ35̚_OAi)]]۲%#}S  ŵe禝d?z?:F`_{*y(_)t8AtjUMhT)*/G0B!74r@Fn|8= 0 OGˮOJ&+bj,RhmldƢEL5Ҫ*Jޢrzsi:rcrS٣\;;AV|ɹ[}Wfϑݻd>Mߔ)q珈 <}OLhp***pVӛ@9wXZv(7m@}%\mnls3aw:%`VEȟ430tW oڐ'va拨^qx 1חՃq.pDT=V`bHu=O_Z ̥KC÷65%T&7hgUWƪ[eb\#Y8=#YAUbd1pbdSapLՕW?iԩmD--C EUܔ629;~優i̻jJ++A fIbI^!4ɪHw<0px<,Z_YYt|\q740񆆤'W+RwWrRs՘_Rkv7_K  ҴRDFiK&.8՜ل % /PAiΖUuD[Ɖ!fzx)pֱR9X/}#v1ݝ8 (z"9t ?F辌q TMdtMC(R},-Sr0Ŭ)&CfaE^GAγBQ(G/2L6qLsPw;&S .r7Q|ox9-_UN5w\AIMq7OӱWOGJR.Jnuw |G[.Jn U>bx%9CQQֿ_)LrǛ?qU/Zc?\3{~-3PY=qc; -Fʎayy . Ո)?EGꚎи/ZGby}\|"sf ek70iRx7fn!m]X4ֹ= UY>5k!BS{r~L/`y{,%N{NM]nt^!UZ6}ց)VZAgrԼBJo?nm_AM4\uQz.д,Pijz2VzβL۱^/?hr]Ǥi-;8&Mwɇ'cձ"('1O(v?}ō)L ٵJ?=JݢL/_l${My./nXtgz;z5g'8+f㮾kQqKh8gSԻ$E/uӎNJ,{uל YpԸ6Zk_2S L=pמS%pB2MFd0Zˁ bY8z ҡ0\ `ˋx`2>L4O9BBnLgǴIENDB`UDJ-Desktop-Client-0.6.4/icons/udjlauncher32x32.png0000664000175000017500000000320512051252546021245 0ustar kurtiskurtisPNG  IHDR szzsBIT|d pHYspStEXtSoftwarewww.inkscape.org<IDATXŗmh[ܫWJZ*+kZ{i,v!qǠnvpK?[ %kRh? f#4 8 }2a_JZȖ{^Ke/Ypt99J)TSJQ3P-~W(B$]@[[˂|zWPJM:=w[C|U֨>#*3qP>Wz9@=^[@7"QV=oe+wQmF\ 3|{rם7s$ h:4Jb̌"0~tcc،Qb~ͪnf&B8&9^yxjP$BWo/[HMC4Q`zÃ腜繚%\\ Oj !GsYʥʲ6u'5F\sg~C|zas">pt| |z!/RQ +Xu."'^#Z<b"wEB$r Rz8>,1~L^U*sDX) <|QnhLXLÝaRɤs `kO\\&Tg2 e(EamN)(r.(##!Ϟ~̎`FhT>=ꖞ] kyV כ( SS<( = f4TG_ MI)GJɾyz}~F* 7( A,óg=eYAJ$"[]876:7GlvfI~3||'~ƏI_B`vz.7\'au"A@\fP H0?9sE V * aXݽn۶P^Tb40=Mk{;;F.!ͺ<^/nҪĎīkڈCOWg66~=,/SZ^Ëz Fc)X r0>0sX"b TV !`ߓsQg6ڵ }Demd 1, >~_5%Byv$%?C |o-v%t;:p6kz9"SlM-\ 6:&wm(;Zn_˺XeEVHe bqWpTqTiOvmN8JsRW4'qf.U*$rWHX}f/]T}V0uaQ%)/qG PV)@Ӷ _GB[T=QEa(n.z u *u.rGFlpFC9DEOvURD,d(a(!LT*D`NT> $|Eg)vtPً8CLsc GPUP6ŴmCEPo:8 GO.D ML'bcMFaӧXyC <~z2Pݾ=rL'M-ʾ;oV7h:v1kbXk9{O2b`wx IENDB`UDJ-Desktop-Client-0.6.4/icons/udjlauncher64x64.png0000664000175000017500000000707012051252546021263 0ustar kurtiskurtisPNG  IHDR@@iqsBIT|d pHYs:tEXtSoftwarewww.inkscape.org< IDATxp\u?o]IkY˶p!۲8c'v\``6әfiOۡ .e:Ld fH;$uֆ ˿ a,뷬nX=Cӯμw}w9s9JH)]rRf4 xsb2<Te5;W ;+>@xEUYQ]s #ېC`^Jy4eNN]?Fx[H)Wi!^Rvkb {`g *"7V.Yԯm5_Yda>勛*" WMMI/ Vjdm2PP/P/FQ R^/ B 1ܧs]pKA2R^uiI'-eH; O.}=܂n!pE\3xRզ(߯Y\ p?D?`6p={nj޸jYt.Sғ8;N$!@JiH,l0/>x>zwYj-bv~g)a~I 2.¡(:#({\' IϞg@VX|# o7ˆgf?A,KκiD9H F/ϒ(a|jDĹ1mI(BںM~BwӰK**X/( aCa=Qp3PמǻMe#;Bi|QȠPu5+W\}}z/\[SBD (4<rx wSI=_RBU%pd`.ЂI>5 _wQpPpx J dgdJ,l?tYbRJ;R֜J,S:۾cYC(`}St)RJb(U5U˃Wye*XD#i7>Po07 OnƮ\v|2cCjdϲ &ؤB<~?Xa2&zBUU pA}:Up;c&bukl'}ܤ)Lp8lwyA<żLy~V46r0qthΝP$ދv,6"Z>Hn%bdF' 6!+0.;Mwru-}jk#X^>ųaH~YBa% Nyjoq1Sw r,-@϶U }J$O[@,Сܼn]7[C~@ N+Whܞ;/j3]QxvU- 0 c4 '(adp?ޒ4ˆ% 'hsV~|n x"g| )_s̝ SPw7%6o;Izzxd~soIECp Ȝ@iƚ6ePfOpZʖ-5M??_}ʥK-pRlRJ¹UE7/Yh5MHYěc/<>z癕ZskmPY_O˱cyv8\.N}IIXA3=ڛhؼPUմCUU4lL{S##9)8lNooDhzN`EeqP{sZy"Ԯ]Kie%]DMn7`KќNN׌McBIR0o-{CHn6acÜկ(U΋d8O_8LW{{r,/H$2TyÆL0uo0 x0oG9Z^BJjkKjQ@PT+e50ooQ&[>.yLaɆDorۃ]2[ƊuXPSi qY{'_ ~SD 9jC>}1C^[O<ef{(ȇFx|VL[ݫ/prjVF4bcct~8z rwnm']uȷNŖp3x)?8n~?KJP5x4s2p˝-:ÛY{H#Gޘ{SUE44]:A||#'20Pw-Oqbː*>!)]G!_{3̐!&+Kb"#>>P$ BA0b/<||}cdX07Ķ?%aRGfb9q&'>ķѰ0Vݚ-$w6XHSVm@si{2d.Rb2{4[xUElڎ ʪ W˰ 2:oOrxE'1Ѝ~E_G$r`9i*ė6g;6bz M+@/ L2}?Q7¼e=A1GXN<ba%쾀CM5e EE 妍7"BK>ЋikWb޲ `F_OOat/;P晣N迌FNl@%ؒr5 ]uZZi蒰8h[CcmHOgr_C≯uWgUVN'fkg}Y-B^(sʂ#k՜$қiKL*^7~WEQ!ex檼-׬)gZՕ *ALTUwRWSDμ/!t_57~/[%w%;E>h%ٛtD;$nZJ5#+A~57Di8j_+;{w _U4#IENDB`UDJ-Desktop-Client-0.6.4/UDJCPack.cmake0000664000175000017500000000666112051252546016755 0ustar kurtiskurtisinclude( InstallRequiredSystemLibraries ) set( CPACK_PACKAGE_CONTACT "Kurtis Nusbaum " ) set( APPLICATION_NAME "UDJ") include( VERSION.cmake ) set( CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR} ) set( CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR} ) set( CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH} ) set( CPACK_PACKAGE_VERSION ${VERSION} ) if(APPLE) set( CPACK_GENERATOR "DragNDrop" ) set( CPACK_SOURCE_GENERATOR "") set( CPACK_PACKAGE_FILE_NAME UDJSetup-${CPACK_PACKAGE_VERSION} ) set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/icons/udjlauncher.icns) set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in") set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" ) set( CPACK_DMG_FORMAT "UDBZ" ) set( CPACK_DMG_VOLUME_NAME "${APPLICATION_NAME}") # did not work with cmake 2.8.7, so we override MacOSXBundleInfo.plist.in #set( CPACK_BUNDLE_PLIST ${CMAKE_SOURCE_DIR}/admin/osx/Info.plist ) # do we need these? #set( CPACK_SYSTEM_NAME "OSX" ) #set( CPACK_PACKAGE_NAME "FOO" ) #set( CPACK_BUNDLE_NAME "BAR" ) endif() if(WIN32) set( CPACK_PACKAGE_FILE_NAME UDJ-${CPACK_PACKAGE_VERSION}-setup ) # Package file name without extension. Also a directory of installer cmake-2.5.0-Linux-i686 # CPACK_GENERATOR CPack generator to be used STGZ;TGZ;TZ # CPACK_INCLUDE_TOPLEVEL_DIRECTORY Controls whether CPack adds a top-level directory, usually of the form ProjectName-Version-OS, to the top of package tree. 0 to disable, 1 to enable # CPACK_INSTALL_CMAKE_PROJECTS List of four values: Build directory, Project Name, Project Component, Directory in the package /home/andy/vtk/CMake-bin;CMake;ALL;/ set( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md" ) # File used as a description of a project /path/to/project/ReadMe.txt set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "UDJ Desktop Player Client" ) # Description summary of a project # CPACK_PACKAGE_EXECUTABLES List of pairs of executables and labels. Used by the NSIS generator to create Start Menu shortcuts. ccmake;CMake set( CPACK_PACKAGE_INSTALL_DIRECTORY ${APPLICATION_NAME} ) # Installation directory on the target system -> C:\Program Files\UDJ set( CPACK_PACKAGE_INSTALL_REGISTRY_KEY ${APPLICATION_NAME} ) # Registry key used when installing this project CMake 2.5.0 set( CPACK_PACKAGE_NAME ${APPLICATION_NAME} ) # Package name, defaults to the project name set( CPACK_PACKAGE_VENDOR "http://udjplayer.com" ) # Package vendor name endif() # set( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt" ) # License file for the project, used by the STGZ, NSIS, and PackageMaker generators. /home/andy/vtk/CMake/Copyright.txt set( CPACK_TOPLEVEL_TAG "unused" ) # Directory for the installed files. - needed to provide anything to avoid an error# CPACK_INSTALL_COMMANDS Extra commands to install components. # Set the options file that needs to be included inside CMakeCPackOptions.cmake configure_file("${CMAKE_SOURCE_DIR}/CPackOptions.cmake.in" "${CMAKE_BINARY_DIR}/CPackOptions.cmake" @ONLY) set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackOptions.cmake") # File included at cpack time, once per generator after setting CPACK_GENERATOR to the actual generator being used; allows per-generator setting of CPACK_* variables at cpack time. ${PROJECT_BINARY_DIR}/CPackOptions.cmake include(CPack) UDJ-Desktop-Client-0.6.4/LICENSE0000664000175000017500000004325412051252546015433 0ustar kurtiskurtis GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. UDJ-Desktop-Client-0.6.4/VERSION.cmake0000664000175000017500000000021112051252546016537 0ustar kurtiskurtisset( VERSION_MAJOR 0 ) set( VERSION_MINOR 6 ) set( VERSION_PATCH 3 ) set( VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} ) UDJ-Desktop-Client-0.6.4/src/0000775000175000017500000000000012051252546015205 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/src/DialogWithLoaderWidget.cpp0000664000175000017500000000552112051252546022242 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "DialogWithLoaderWidget.hpp" #include "WidgetWithLoader.hpp" #include "DataStore.hpp" #include "Logger.hpp" #include #include namespace UDJ{ DialogWithLoaderWidget::DialogWithLoaderWidget( QString loadingText, QString positiveButtonText, QString negativeButtonText, bool centerPositiveButton, QWidget *parent, Qt::WindowFlags f):QDialog(parent, f) { setupUi(loadingText, positiveButtonText, negativeButtonText, centerPositiveButton); } void DialogWithLoaderWidget::setNegativeButtonEnabled(bool enabled){ negativeButtonEnabled = enabled; if(negativeButtonEnabled && loaderWidget->isMainWidgetShowing()){ negativeButton->show(); } else{ negativeButton->hide(); } } void DialogWithLoaderWidget::showLoadingText(){ loaderWidget->showLoadingText(); negativeButton->hide(); positiveButton->hide(); } void DialogWithLoaderWidget::showMainWidget(){ loaderWidget->showMainWidget(); if(negativeButtonEnabled){ negativeButton->show(); } positiveButton->show(); } void DialogWithLoaderWidget::setMainWidget(QWidget *mainWidget){ loaderWidget->setMainWidget(mainWidget); loaderWidget->showMainWidget(); } void DialogWithLoaderWidget::closeDialog(){ done(QDialog::Accepted); } void DialogWithLoaderWidget::setupUi( QString loadingText, QString positiveText, QString negativeText, bool centerPositiveButton) { positiveButton = new QPushButton(positiveText); negativeButton = new QPushButton(negativeText); positiveButton->setDefault(true); positiveButton->setAutoDefault(true); loaderWidget = new WidgetWithLoader(loadingText, this); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(loaderWidget, 0,0,3,3); if(centerPositiveButton){ mainLayout->addWidget(negativeButton, 4,0); mainLayout->addWidget(positiveButton, 4,1); } else{ mainLayout->addWidget(negativeButton, 4,1); mainLayout->addWidget(positiveButton, 4,2); } setLayout(mainLayout); connect( positiveButton, SIGNAL(clicked()), this, SLOT(accept())); connect( negativeButton, SIGNAL(clicked()), this, SLOT(reject())); } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/UDJServerConnection.hpp0000664000175000017500000006566112051252546021565 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef UDJ_SERVER_CONNECTION_HPP #define UDJ_SERVER_CONNECTION_HPP #include #include #include #include #include #include #include "ConfigDefs.hpp" class QNetworkAccessManager; class QNetworkCookieJar; namespace UDJ{ /** * \brief Represents a connection to the UDJ server. */ class UDJServerConnection : public QObject{ Q_OBJECT public: /** @name Constructor */ //@{ /** * \brief Constructs a UDJServerConnection. * * \param parent The parent object. */ UDJServerConnection(QObject *parent=NULL); //@} /** @name Connection Controls */ //@{ /** * \brief Perform authentication with the server. * * @param username The username. * @param password The password. */ void authenticate(const QString& username, const QString& password); /** * \brief Sets the ticket to be used when communicating with the server. * * \param ticket The ticket to be used when communicating with the server. */ inline void setTicket(const QByteArray& ticket){ ticket_hash = ticket; } /** * \brief Sets the user id to be used when communicating with the server. * * \param ticket The user id to be used when communicating with the server. */ inline void setUserId(const user_id_t& userId){ user_id = userId; } /** * \brief Sets the player id to be used when communicating with the server. * * \param ticket The player id to be used when communicating with the server. */ inline void setPlayerId(const player_id_t& newPlayerId){ playerId = newPlayerId; } //@} public slots: /** @name Slots */ //@{ /** * \brief Tells the server to set the players location to the given location. * * \param streetAddress Street address of the given location. * \param city City of the given location. * \param state State of the given location. * \param zipcode Zipcode of the given location. */ void setPlayerLocation( const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode ); /** * \brief Tesll the server to remove the player's password. */ void removePlayerPassword(); /** * \brief Tells the server to change the player's password. * * \param newPassword New password for the player. */ void setPlayerPassword(const QString& newPassword); /** * \brief Sets the player state. * * \param newState State to which the player should be set. */ void setPlayerState(const QString& newState); /** * \brief Modifies the conents of the library on the server. * * @param songsToAdd A list of song that should be added to the server. * @param songsToDelete A list of song ids that should be removed from the server. */ void modLibContents(const QVariantList& songsToAdd, const QVariantList& songsToDelete); /** * \brief Creates a player on the server. * * @param playerName The name of the player. * @param password The password of the player (may be empty thus indicating now password). */ void createPlayer( const QString& playerName, const QString& password); /** * \brief Creates a player on the server. * * @param playerName The name of the player. * @param password The password of the player (may be empty thus indicating now password). */ void createPlayer( const QString& playerName, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode); /** * \brief Creates a player on the server using the given JSON payload. * * @param payload JSON representing the player to be created. */ void createPlayer(const QByteArray& payload); /** * \brief Retrieves the latest version of the active playlist from the server. */ void getActivePlaylist(); /** * \brief Modifies the active playlist on the server. * * \param toAdd A list of library songs that should be added to the playlist. * \param toRemove A list of library songs that should be removed from the playlist. */ void modActivePlaylist( const QSet& toAdd, const QSet& toRemove); /** * \brief Set's the current song that the player is playing on the server. * * @param currentSong Id The current song that the client is playing. */ void setCurrentSong(library_song_id_t currentSong); /** * \brief Sets the volume of the player on the server. * * @param newVolume The volume to which the player should be set. */ void setVolume(int newVolume); /** * \brief Tells the server that current song has finished playing. */ void clearCurrentSong(); /** * \brief Retrieves a list of active participants from the server. */ void getParticipantList(); //@} signals: /** @name Signals */ //@{ /** * \brief Emitted when a connection with the server has been established. * * \param ticketHash The ticket hash that was given by the server as a result of the authentication. * \param userId The userId assignd to ther user that was used to authenticate with the server. */ void authenticated(const QByteArray& ticketHash, const user_id_t& userId); /** * \brief Emitted when there was a failure to establish a connection with the * server. * * @param errMessage A message describing the error. */ void authFailed(const QString errMessage); /** * \brief Emitted when the player's password is succesfully removed. */ void playerPasswordRemoved(); /** * \brief Emitted when there was an error removing the player's password. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void playerPasswordRemoveError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when the player's password is succesfully set. * * \param password The password that was set for the player. */ void playerPasswordSet(const QString& password); /** * \brief Emitted when there was an error setting the player's password. * * @param attemptedPassword The password that was attempted to be set on the player. * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void playerPasswordSetError( const QString& attemptedPassword, const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when the player's location is succesfully set. * * \param streetAddress Street address of the set location. * \param city City of the set location. * \param state State of the set location. * \param zipcode Zipcode of the set location. */ void playerLocationSet( const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode); /** * \brief Emitted when there was an error setting the player's location. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void playerLocationSetError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when chaning the players name is succesful on the server. * * @param newName The new name of the player. */ void playerNameChanged(const QString& newName); /** * \brief Emitted when there was an error changing the players name. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void playerNameChangeError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when the current song was succesfully cleared on the server. */ void currentSongCleared(); /** * \brief Emitted when there is an error clearing the current song on the server. */ void currentSongClearError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when the state on the player was changed. * * @param newState The new state. */ void playerStateSet(const QString& newState); /** * \brief Emitted when there was an error changing the players state. * * @param desiredState The state which failed to be set on the player. * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void playerStateSetError( const QString& desiredState, const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when a set of songs was succesfully synced on the server. * * \param syncedIds The set of ids that were succesfully synced to the server. */ void libSongsSyncedToServer(const QSet& syncedIds); /** * \brief Emitted when there was an error syncing certains library songs with the server. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void libModError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when an player is succesfully created. */ void playerCreated(const player_id_t& issuedId); /** * \brief Emitted when there was an error creating a player on the server. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void playerCreationFailed( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when a new version of the active playlist is retrieved from * the server. * * @param newPlaylist The new playlist that was retreived from the server. */ void newActivePlaylist(const QVariantMap& newPlaylist); /** * \brief Emitted when there was an error getting the active playlist from the server. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void getActivePlaylistFail( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when a new version of the participants list is retrieved from the server. * * @param newParticipants The new list of participants that was retrieved from the server. */ void newParticipantList(const QVariantList& newParticipants); /** * \brief Emitted when there was an error getting the list of participants from the server. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void getParticipantsError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when the current song that the player is playing is * succesfully set on the server. */ void currentSongSet(); /** * \brief Emitted when there in a error setting the current song to be played on the server. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void setCurrentSongFailed( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Emitted when the active playlist was successfully modified on the server. * * @param added The set of songs that were succesfully added to the playlist on the server. * @param removed The set of songs that were succesfully removed from the playlist on the server. */ void activePlaylistModified( const QSet& added, const QSet& removed); /** * \brief Emitted when there in a error modifying the playlist on the server. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void activePlaylistModFailed( const QString& errMessage, int errorCode, const QList& headers); void volumeSetOnServer(); /** * \brief Emitted when there in an error setting the song on the server. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void setVolumeFailed( const QString& errMessage, int errorCode, const QList& headers); //@} private slots: /** @name Private Slots */ //@{ /** * \brief Handles a reply from the server. * * @param reply The reply from the server. */ void recievedReply(QNetworkReply *reply); //@} private: /** @name Private Members */ //@{ /** \brief Ticket hash that should be used for all requests. */ QByteArray ticket_hash; /** \brief Id of the user that is currently logged in. */ user_id_t user_id; /** \brief Id of the player associated with this conneciton */ player_id_t playerId; /** \brief Manager for access to the network. */ QNetworkAccessManager *netAccessManager; //@} /** @name Private Function */ //@{ /** * \brief Handle a response from the server regarding authentication. * * @param reply Response from the server. */ void handleAuthReply(QNetworkReply* reply); /** * \brief Handles a state set reply. * * \param the response from the server. */ void handleSetStateReply(QNetworkReply* reply); /** * \brief Handles a lib modificaiton reply. * * \param the response from the server. */ void handleReceivedLibMod(QNetworkReply *reply); /** * \brief Handle a response from the server regarding player creation. * * @param reply Response from the server. */ void handleCreatePlayerReply(QNetworkReply *reply); /** * \brief Handle a response from the server regarding a new active playlist. * * @param reply Response from the server. */ void handleReceivedActivePlaylist(QNetworkReply *reply); /** * \brief Handle a response from the server regarding the addition of a song * to the active playlist. * * @param reply Response from the server. */ void handleReceivedActivePlaylistAdd(QNetworkReply *reply); /** * \brief Handle a response from the server regarding the removal of a song * from the active playlist. * * @param reply Response from the server. */ void handleReceivedActivePlaylistRemove(QNetworkReply *reply); /** * \brief Handle a response from the server regarding the setting of the * current song that is being played. * * @param reply Response from the server. */ void handleReceivedCurrentSongSet(QNetworkReply *reply); /** * \brief Handle a response from the server regarding a modification of the playlist. * * @param reply Response from the server. */ void handleReceivedPlaylistMod(QNetworkReply *reply); /** * \brief Handle a response from the server regarding the setting of the player volume. * * @param reply Response from the server. */ void handleReceivedVolumeSet(QNetworkReply *reply); /** * \brief Handle a response from the server regarding the removing of the player's password. * * @param reply Response from the server. */ void handlePlayerPasswordRemoveReply(QNetworkReply *reply); /** * \brief Handle a response from the server regarding the setting of the player's password. * * @param reply Response from the server. */ void handlePlayerPasswordSetReply(QNetworkReply *reply); /** * \brief Handle a response from the server regarding the setting of the player location. * * @param reply response from the server. */ void handleLocationSetReply(QNetworkReply *reply); /** * \brief Handles a response from the server regarding the clearing of the current song. * * @param reply The response from the server. */ void handleRecievedClearCurrentSong(QNetworkReply *reply); /** * \brief Handles a response from the server regarding getting a list of active participants. * * @param reply The response from the server. */ void handleParticipantsResponse(QNetworkReply *reply); /** * \brief Prepares a network request that is going to include JSON. * * @param request Request to prepare. */ void prepareJSONRequest(QNetworkRequest &request); /** * \brief Gets the url used for accessing the player's password. * * \return The url used for accessing the player's password. */ QUrl getPlayerPasswordUrl() const; /** * \brief Gets the url used for accessing the player's location. * * \return The url used for accessing the player's location. */ QUrl getPlayerLocationUrl() const; /** * \brief Gets the url that should be used for modifying the library. * * \return The url that should be used for modifying the library. */ QUrl getLibModUrl() const; /** * \brief Get the url for interacting with the active playlist from the server. * * @return The for interacting with the active playlist from the server. */ QUrl getActivePlaylistUrl() const; /** * \brief Get the url to be used for setting the current song on the server. * * @return The url to be used for setting the current song on the server. */ QUrl getCurrentSongUrl() const; /** * \brief Get the url to be used for retrieving the list of current participants. * * @return The url to be used for getting the current participants. */ QUrl getParticipantsUrl() const; /** * \brief Gets the url that should be used for creating a player on the server. * * \return The url that sholud be used for creating a player on the server. */ QUrl getCreatePlayerUrl() const; /** * \brief Gets the url that should be used for modifying or getting * the player state from the server. * * \return The url that sholud be used for modifying or getting * the player state from the server. */ QUrl getPlayerStateUrl() const; /** * \brief Gets the url that should be used for setting the volume on the server. * * \return The url that sholud be used for setting the volume on the server. */ QUrl getVolumeUrl() const; /** * \brief Determines if the given network reply is in response to a request to * obtain the active playlist. * * \param reply The network reply in question. * \return True if the reply is a response to getting the active playlist. False otherwise. */ bool isGetActivePlaylistReply(const QNetworkReply *reply) const; /** * \brief Determines if the given network reply is in response to a request to * modify the active playlist. * * \param reply The network reply in question. * \return True if the reply is a response to modifying the active playlist. False otherwise. */ bool isModActivePlaylistReply(const QNetworkReply *reply) const; /** * \brief Determines if the reply is a response to a request that the player's password be set. * * \param reply The network reply in question. * \return True if the reply is a response to setting the player's password. False otherwise. */ bool isPasswordSetReply(const QNetworkReply* reply) const; /** * \brief Determines if the reply is a response to a request that the player's password be removed. * * \param reply The network reply in question. * \return True if the reply is a response to removing the player's password. False otherwise. */ bool isPasswordRemoveReply(const QNetworkReply* reply) const; /** * \brief Determines if a given reply has the same Http Status code as the one specified. * * \param reply QNetworkReply in question. * \param code The status code to be checked. * \return True if the reply if has the status code provided, false otherwise. */ static bool isResponseType(QNetworkReply *reply, int code); //@} /** @name Private Constants */ //@{ /** * \brief Get the port number to be used when communicating with the server. * * This port number is a memorial to Keith Nusbaum, my father. I loved him * deeply and he was taken from this world far too soon. Never-the-less * we all continue to benefit from his good deeds. Without him, I wouldn't * be here, and there would be no UDJ. Please, don't change this port * number. Keep the memory of my father alive. * K = 10 % 10 = 0 * e = 4 % 10 = 4 * i = 8 % 10 = 8 * t = 19 % 10 = 9 * h = 7 % 10 = 7 * Port 4897, the Keith Nusbaum Memorial Port * * @return The port number to be used for communicating with the server. */ static const QString & getServerPortNumber(){ static const QString serverPortNumber = "4897"; return serverPortNumber; } /** * \brief Gets the url path to the server in string form. * * @return The url path to the server in string form. */ static const QString& getServerUrlPath(){ static const QString SERVER_URL_PATH= "https://udjplayer.com:" + getServerPortNumber() + "/udj/0_6/"; return SERVER_URL_PATH; } /** * \brief Gets the url path to the server in URL form. * * @return The url path to the server in URL form. */ static const QUrl& getServerUrl(){ static const QUrl SERVER_URL(getServerUrlPath()); return SERVER_URL; } /** * \brief Gets the url for authenticating with the server. * * @return The url for authenticating with the server. */ static const QUrl& getAuthUrl(){ static const QUrl AUTH_URL(getServerUrlPath() + "auth"); return AUTH_URL; } /** * \brief Get the header used for identifying the ticket hash header. * * @return The header used for identifying the ticket hash header. */ static const QByteArray& getTicketHeaderName(){ static const QByteArray ticketHeaderName = "X-Udj-Ticket-Hash"; return ticketHeaderName; } /** * \brief Get the header used for identifying the Missing Resource header. * * @return The header used for identifying the Missing Resource header. */ static const QByteArray& getMissingResourceHeader(){ static const QByteArray missingResourceHeader = "X-Udj-Missing-Resource"; return missingResourceHeader; } /** * \brief Gets the property name for a player name property. * * \return The property name for a player name property. */ static const char* getPlayerNamePropertyName(){ static const char* playerNamePropertyName = "player_name"; return playerNamePropertyName; } /** * \brief Gets the property name for a player password property. * * \return The property name for a player password property. */ static const char* getPlayerPasswordPropertyName(){ static const char* playerPasswordPropertyName = "playerPassword"; return playerPasswordPropertyName; } /** * \brief Gets the property name for a location address property. * * \return The property name for a location address property. */ static const char* getLocationAddressPropertyName(){ static const char* locationAddressPropertyName = "address"; return locationAddressPropertyName; } /** * \brief Gets the property name for a location city property. * * \return The property name for a location city property. */ static const char* getLocationCityPropertyName(){ static const char* locationCityPropertyName = "city"; return locationCityPropertyName; } /** * \brief Gets the property name for a location state property. * * \return The property name for a location state property. */ static const char* getLocationStatePropertyName(){ static const char* locationStatePropertyName = "state"; return locationStatePropertyName; } /** * \brief Gets the property name for a location zipcode property. * * \return The property name for a location zipcode property. */ static const char* getLocationZipcodePropertyName(){ static const char* locationZipcodePropertyName = "zipcode"; return locationZipcodePropertyName; } /** * \brief Gets the property name for a state property. * * \return The property name for a state property. */ static const char* getStatePropertyName(){ static const char* statePropertyName = "state"; return statePropertyName; } /** * \brief Gets the property name for a songs_added property. * * \return The property name for a songs_added property. */ static const char* getSongsAddedPropertyName(){ static const char* songsAddedPropertyName = "songs_added"; return songsAddedPropertyName; } /** * \brief Gets the property name for a songs_deleted property. * * \return The property name for a songs_deleted property. */ static const char* getSongsDeletedPropertyName(){ static const char* songsDeletedPropertyName = "songs_deleted"; return songsDeletedPropertyName; } /** * \brief Gets the property name for a songs_removed property. * * \return The property name for a songs_removed property. */ static const char* getSongsRemovedPropertyName(){ static const char* songsRemovedPropertyName = "songs_removed"; return songsRemovedPropertyName; } //@} }; } //end namespace #endif //UDJ_SERVER_CONNECTION_HPP UDJ-Desktop-Client-0.6.4/src/PlaybackWidget.hpp0000664000175000017500000001166712051252546020623 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef PLAYBACK_WIDGET_HPP #define PLAYBACK_WIDGET_HPP #include "DataStore.hpp" #include #include #include #include #include class QAction; class QLabel; namespace UDJ{ /** \brief Widget used for controlling music playback. */ class PlaybackWidget : public QWidget{ Q_OBJECT public: /** @name Public Enums */ //@{ /** \brief The various states of playback that the widget can be in. */ enum PlaybackState {PAUSED, PLAYING}; //@} /** @name Constructors */ //@{ /** * \brief Constructs a Playback widget. * * @param dataStore The DataStore backing this instance of UDJ. * @param parent The parent widget. */ PlaybackWidget(DataStore *dataStore, QWidget *parent=0); //@} public slots: /** @name Public Slots */ //@{ /** * \brief Toggles the playback state of playback widget. */ void togglePlaybackState(); //@} private slots: /** @name Private Slots */ //@{ /** \brief Enables playback. */ void play(); /** \brief Pauses playback. */ void pause(); /** * \brief Handles whenever the state of the primary * MediaObject is changed. * * @param newState The new state of the primary MediaObject. * @parma oldState The old state of the primary MediaObject. */ void stateChanged(Phonon::State newState, Phonon::State oldState); /** \brief Called when ever the primary MediaObject "ticks" * * @param time The current time of the primary MediaObject. */ void tick(qint64 time); /** * \brief Called whenever media source of the primary MediaObject is changed. * * @param source The new source of the primary MediaObject. */ void sourceChanged(const Phonon::MediaSource &source); /** * \brief Called when the next available song should be played. */ void playNextSong(); /** \brief Handles when meta data is changed. */ void metaDataChanged(); /** * \brief Sets the currently playing song to the given new song. * * @param newSong The new song that should be playing. */ void setNewSource(DataStore::song_info_t newSong); /** \brief Clears the data on the playback widget. */ void clearWidget(); /** \brief Takes appropriate action when the playlist is changed. */ void handlePlaylistChange(); /** \brief Takes appropriate action when the player state is changed. */ void onPlayerStateChanged(const QString& newState); //@} private: /** @name Private Functions */ //@{ /** \brief Sets up all the actions used by the MetaWindow. */ void createActions(); /** \brief Initializes UI. */ void setupUi(); /** * \brief Informs the user the song that they just tried to play doesn't work. */ void informBadSong(); /** * \brief Sets the song info in the widget. * * \param newSong The info that should be set in the widget. */ void setSongInfo(const DataStore::song_info_t& newSong); //@} /** @name Private Memeber */ //@{ /** \brief The data store backing this instance of UDJ. */ DataStore *dataStore; /** \brief The current state of music playback. */ PlaybackState currentPlaybackState; /** \brief The title of the current song being played. */ QString currentSongTitle; /** \brief The artist of the current song being played. */ QString currentSongArtist; /** \brief The duration of the current song being played. */ QString currentSongDuration; /** \brief Causes playback to start */ QAction *playAction; /** \brief Pauses playback */ QAction *pauseAction; /** \brief Skips to the next song */ QAction *skipAction; /** \brief Used to display info of the currently playing song. */ QLabel *songInfo; /** \bried Used to display the time played of the current song. */ QLabel *timeLabel; /** \brief The primary media object used for song playback. */ Phonon::MediaObject *mediaObject; /** \brief The primary audioOutput device used for song playback. */ Phonon::AudioOutput *audioOutput; /** \brief The volume slider used to control playback volume. */ Phonon::VolumeSlider *volumeSlider; /** \brief The seek slider for adjusting playback position. */ Phonon::SeekSlider *seekSlider; //@} }; } //end namespace UDJ #endif UDJ-Desktop-Client-0.6.4/src/ParticipantsModel.hpp0000664000175000017500000000240412051252546021340 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef PARTICIPANTS_MODEL_HPP #define PARTICIPANTS_MODEL_HPP #include namespace UDJ{ class DataStore; class ParticipantsModel : public QStandardItemModel{ Q_OBJECT public: ParticipantsModel(DataStore *dataStore, QObject *parent=0); private slots: void onNewParticipantList(const QVariantList& newParticipants); private: static QString getAttrWithDefault( const QVariantMap& user, const QString& attr, const QString& defaultValue); void setHeaders(); DataStore *dataStore; }; } //end namespace UDJ #endif //PARTICIPANTS_MODEL_HPP UDJ-Desktop-Client-0.6.4/src/UDJServerConnection.cpp0000664000175000017500000005061712051252546021553 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include #include #include #include #include "UDJServerConnection.hpp" #include "JSONHelper.hpp" #include "Logger.hpp" #include QByteArray stripControllCharacters(const QByteArray& toStrip){ QString stripString = QString::fromUtf8(toStrip); stripString = stripString.replace("[\\x00-\\x1f]", ""); return stripString.toUtf8(); } namespace UDJ{ UDJServerConnection::UDJServerConnection(QObject *parent):QObject(parent), ticket_hash(""), user_id(-1), playerId(-1) { netAccessManager = new QNetworkAccessManager(this); connect(netAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(recievedReply(QNetworkReply*))); } void UDJServerConnection::prepareJSONRequest(QNetworkRequest &request){ request.setHeader(QNetworkRequest::ContentTypeHeader, "text/json"); request.setRawHeader(getTicketHeaderName(), ticket_hash); } void UDJServerConnection::authenticate( const QString& username, const QString& password) { QNetworkRequest authRequest(getAuthUrl()); QString data("username="+username+"&password="+password); QBuffer *dataBuffer = new QBuffer(); dataBuffer->setData(data.toUtf8()); QNetworkReply *reply = netAccessManager->post(authRequest, dataBuffer); dataBuffer->setParent(reply); Logger::instance()->log("Doing auth request"); } void UDJServerConnection::modLibContents(const QVariantList& songsToAdd, const QVariantList& songsToDelete) { QNetworkRequest modRequest(getLibModUrl()); modRequest.setRawHeader(getTicketHeaderName(), ticket_hash); QByteArray addJSON = JSONHelper::getJSONForLibAdd(songsToAdd); QByteArray deleteJSON = JSONHelper::getJSONForLibDelete(songsToDelete); Logger::instance()->log("Lib mod add JSON: " + QString::fromUtf8(addJSON)); Logger::instance()->log("Lib mod delete JSON: " + QString::fromUtf8(deleteJSON)); addJSON = stripControllCharacters(addJSON); //Don't use Qt URL functions to encode. They do weird stuff that we don't //want like attempt to encode unicode characters in url encoding style QByteArray payload = "to_add=" + addJSON.replace("%", "%25").replace("&", "%26").replace("=", "%3D").replace(";", "%3B").replace("\x02","") + "&to_delete=" + deleteJSON; Logger::instance()->log("Lib mod payload: " + QString::fromUtf8(payload)); QNetworkReply *reply = netAccessManager->post(modRequest, payload); Logger::instance()->log("Issued request" + QString::fromUtf8(payload)); reply->setProperty(getSongsAddedPropertyName(), addJSON); reply->setProperty(getSongsDeletedPropertyName(), deleteJSON); Logger::instance()->log("Set reply properties" + QString::fromUtf8(payload)); } void UDJServerConnection::createPlayer( const QString& playerName, const QString& password) { const QByteArray playerJSON = JSONHelper::getCreatePlayerJSON(playerName, password); createPlayer(playerJSON); } void UDJServerConnection::createPlayer( const QString& playerName, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode) { const QByteArray playerJSON = JSONHelper::getCreatePlayerJSON(playerName, password, streetAddress, city, state, zipcode); Logger::instance()->log("Sending player json to server for creation: " + QString(playerJSON)); createPlayer(playerJSON); } void UDJServerConnection::createPlayer(const QByteArray& payload){ QNetworkRequest createPlayerRequest(getCreatePlayerUrl()); prepareJSONRequest(createPlayerRequest); /*QNetworkReply *reply =*/ netAccessManager->put(createPlayerRequest, payload); } void UDJServerConnection::removePlayerPassword(){ QNetworkRequest removePasswordRequest(getPlayerPasswordUrl()); removePasswordRequest.setRawHeader(getTicketHeaderName(), ticket_hash); /*QNetworkReply *reply =*/ netAccessManager->deleteResource(removePasswordRequest); } void UDJServerConnection::setPlayerPassword(const QString& newPassword){ QNetworkRequest setPasswordRequest(getPlayerPasswordUrl()); setPasswordRequest.setRawHeader(getTicketHeaderName(), ticket_hash); QUrl params; params.addQueryItem("password", newPassword); QByteArray payload = params.encodedQuery(); QNetworkReply *reply = netAccessManager->post(setPasswordRequest, payload); reply->setProperty(getPlayerPasswordPropertyName(), newPassword); } void UDJServerConnection::setPlayerLocation( const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode ) { QNetworkRequest setLocationRequest(getPlayerLocationUrl()); setLocationRequest.setRawHeader(getTicketHeaderName(), ticket_hash); QUrl params; params.addQueryItem("address", streetAddress); params.addQueryItem("locality", city); params.addQueryItem("region", state); params.addQueryItem("postal_code", zipcode); params.addQueryItem("country", "United States"); QByteArray payload = params.encodedQuery(); QNetworkReply *reply = netAccessManager->post(setLocationRequest, payload); reply->setProperty(getLocationAddressPropertyName(), streetAddress); reply->setProperty(getLocationCityPropertyName(), city); reply->setProperty(getLocationStatePropertyName(), state); reply->setProperty(getLocationZipcodePropertyName(), zipcode); } void UDJServerConnection::getActivePlaylist(){ QNetworkRequest getActivePlaylistRequest(getActivePlaylistUrl()); getActivePlaylistRequest.setRawHeader(getTicketHeaderName(), ticket_hash); netAccessManager->get(getActivePlaylistRequest); } void UDJServerConnection::modActivePlaylist( const QSet& toAdd, const QSet& toRemove ) { QNetworkRequest modRequest(getActivePlaylistUrl()); modRequest.setRawHeader(getTicketHeaderName(), ticket_hash); QByteArray addJSON = JSONHelper::getJSONLibIds(toAdd); QByteArray removeJSON = JSONHelper::getJSONLibIds(toRemove); QUrl params; params.addQueryItem("to_add", addJSON); params.addQueryItem("to_remove", removeJSON); QByteArray payload = params.encodedQuery(); QNetworkReply *reply = netAccessManager->post(modRequest, payload); reply->setProperty(getSongsAddedPropertyName(), addJSON); reply->setProperty(getSongsRemovedPropertyName(), removeJSON); } void UDJServerConnection::setCurrentSong(library_song_id_t currentSong){ Logger::instance()->log("Setting current song"); QString params = "lib_id="+QString::number(currentSong); QNetworkRequest setCurrentSongRequest(getCurrentSongUrl()); setCurrentSongRequest.setRawHeader(getTicketHeaderName(), ticket_hash); /*QNetworkReply *reply =*/ netAccessManager->post(setCurrentSongRequest, params.toUtf8()); } void UDJServerConnection::setVolume(int volume){ Logger::instance()->log("Setting volume"); QUrl params; params.addQueryItem("volume", QString::number(volume)); QNetworkRequest setCurrentVolumeRequest(getVolumeUrl()); setCurrentVolumeRequest.setRawHeader(getTicketHeaderName(), ticket_hash); /*QNetworkReply *reply = */ netAccessManager->post(setCurrentVolumeRequest, params.encodedQuery()); } void UDJServerConnection::setPlayerState(const QString& newState){ Logger::instance()->log("Setting player state to " + newState); QString params("state="+newState); QByteArray payload = params.toUtf8(); QNetworkRequest setPlayerActiveRequest(getPlayerStateUrl()); setPlayerActiveRequest.setRawHeader(getTicketHeaderName(), ticket_hash); QNetworkReply *reply = netAccessManager->post(setPlayerActiveRequest, payload); reply->setProperty(getStatePropertyName(), newState); } void UDJServerConnection::clearCurrentSong(){ Logger::instance()->log("Clearing current song"); QNetworkRequest clearCurrentSongRequest(getCurrentSongUrl()); clearCurrentSongRequest.setRawHeader(getTicketHeaderName(), ticket_hash); /*QNetworkReply *reply =*/ netAccessManager->deleteResource(clearCurrentSongRequest); } void UDJServerConnection::getParticipantList(){ QNetworkRequest getParticipantListRequest(getParticipantsUrl()); getParticipantListRequest.setRawHeader(getTicketHeaderName(), ticket_hash); /*QNetworkReply *reply =*/ netAccessManager->get(getParticipantListRequest); } void UDJServerConnection::recievedReply(QNetworkReply *reply){ if(reply->request().url().path() == getAuthUrl().path()){ handleAuthReply(reply); } else if(reply->request().url().path() == getPlayerStateUrl().path()){ handleSetStateReply(reply); } else if(reply->request().url().path() == getCreatePlayerUrl().path()){ handleCreatePlayerReply(reply); } else if(isGetActivePlaylistReply(reply)){ handleReceivedActivePlaylist(reply); } else if(reply->request().url().path() == getCurrentSongUrl().path() && reply->operation() == QNetworkAccessManager::PostOperation) { handleReceivedCurrentSongSet(reply); } else if(reply->request().url().path() == getCurrentSongUrl().path() && reply->operation() == QNetworkAccessManager::DeleteOperation) { handleRecievedClearCurrentSong(reply); } else if(reply->request().url().path() == getLibModUrl().path()){ handleReceivedLibMod(reply); } else if(reply->request().url().path() == getVolumeUrl().path()){ handleReceivedVolumeSet(reply); } else if(isModActivePlaylistReply(reply)){ handleReceivedPlaylistMod(reply); } else if(reply->request().url().path() == getPlayerLocationUrl().path()){ handleLocationSetReply(reply); } else if(isPasswordSetReply(reply)){ handlePlayerPasswordSetReply(reply); } else if(isPasswordRemoveReply(reply)){ handlePlayerPasswordRemoveReply(reply); } else if(reply->request().url().path() == getParticipantsUrl().path()){ handleParticipantsResponse(reply); } else{ Logger::instance()->log("Received unknown response"); Logger::instance()->log(reply->request().url().path()); } reply->deleteLater(); } void UDJServerConnection::handleAuthReply(QNetworkReply* reply){ bool success = true; QVariantMap authReplyJSON = JSONHelper::getAuthReplyFromJSON(reply, success); if(reply->error() == QNetworkReply::NoError && success){ Logger::instance()->log("Got good auth reply"); emit authenticated(authReplyJSON["ticket_hash"].toByteArray(), authReplyJSON["user_id"].value()); } else if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 401){ emit authFailed(tr("Incorrect Username and password")); } else if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 501){ emit authFailed(tr("Your version of the UDJ player is out of date. Please check www.udjplayer.com for an update.")); } else{ QByteArray responseData = reply->readAll(); QString responseString = QString::fromUtf8(responseData); Logger::instance()->log(responseString); emit authFailed( tr("We're experiencing some techinical difficulties. " "We'll be back in a bit")); } } void UDJServerConnection::handleRecievedClearCurrentSong(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit currentSongCleared(); } else{ QString responseData = QString(reply->readAll()); Logger::instance()->log("Clear current song failed " + responseData); emit currentSongClearError( responseData, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleParticipantsResponse(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit newParticipantList(JSONHelper::getParticipantListFromJSON(reply)); } else{ QString responseData = QString(reply->readAll()); Logger::instance()->log("Participan get error " + responseData); emit getParticipantsError( responseData, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleSetStateReply(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit playerStateSet(reply->property(getStatePropertyName()).toString()); } else{ QString responseData = QString(reply->readAll()); Logger::instance()->log("Player state set error " + responseData); emit playerStateSetError( reply->property(getStatePropertyName()).toString(), responseData, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handlePlayerPasswordRemoveReply(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit playerPasswordRemoved(); } else{ QString responseData = QString(reply->readAll()); Logger::instance()->log("Player password remove error " + responseData); emit playerPasswordRemoveError( responseData, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handlePlayerPasswordSetReply(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit playerPasswordSet(reply->property(getPlayerPasswordPropertyName()).toString()); } else{ QString responseData = QString(reply->readAll()); Logger::instance()->log("Set player password error " + responseData); emit playerPasswordSetError( reply->property(getPlayerPasswordPropertyName()).toString(), responseData, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleLocationSetReply(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit playerLocationSet( reply->property(getLocationAddressPropertyName()).toString(), reply->property(getLocationCityPropertyName()).toString(), reply->property(getLocationStatePropertyName()).toString(), reply->property(getLocationZipcodePropertyName()).toString()); } else{ QString responseData = QString(reply->readAll()); Logger::instance()->log("Setting player location error: " + responseData); emit playerLocationSetError(responseData, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleReceivedLibMod(QNetworkReply *reply){ if(isResponseType(reply, 200)){ Logger::instance()->log("got good lib mod reply"); QVariant songsAdded = reply->property(getSongsAddedPropertyName()); QVariant songsDeleted = reply->property(getSongsDeletedPropertyName()); QSet addedIds = JSONHelper::getLibIds(songsAdded.toByteArray()); QSet deletedIds = JSONHelper::convertLibIdArray(songsDeleted.toByteArray()); QSet allSynced = addedIds.unite(deletedIds); emit libSongsSyncedToServer(allSynced); } else{ Logger::instance()->log("Got bad lib mod"); QByteArray response = reply->readAll(); QString responseMsg = QString::fromUtf8(response); emit libModError("error: " + responseMsg, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleCreatePlayerReply(QNetworkReply *reply){ if(isResponseType(reply, 201)){ player_id_t issuedId = JSONHelper::getPlayerId(reply); emit playerCreated(issuedId); } else{ Logger::instance()->log("Player creation failed"); QByteArray response = reply->readAll(); QString responseMsg = QString(response); emit playerCreationFailed( "error: " + responseMsg, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleReceivedActivePlaylist(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit newActivePlaylist(JSONHelper::getActivePlaylistFromJSON(reply)); } else{ Logger::instance()->log("Getting playlist failed"); QByteArray response = reply->readAll(); QString responseMsg = QString(response); emit getActivePlaylistFail( "error: " + responseMsg, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleReceivedPlaylistMod(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit activePlaylistModified( JSONHelper::extractSongLibIds(reply->property(getSongsAddedPropertyName()).toByteArray()), JSONHelper::extractSongLibIds(reply->property(getSongsRemovedPropertyName()).toByteArray()) ); } else{ Logger::instance()->log("Modding playlist failed"); QByteArray response = reply->readAll(); QString responseMsg = QString(response); emit activePlaylistModFailed( "error: " + responseMsg, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleReceivedCurrentSongSet(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit currentSongSet(); } else{ Logger::instance()->log("Setting current song failed"); QByteArray response = reply->readAll(); QString responseMsg = QString(response); emit setCurrentSongFailed( "error: " + responseMsg, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } void UDJServerConnection::handleReceivedVolumeSet(QNetworkReply *reply){ if(isResponseType(reply, 200)){ emit volumeSetOnServer(); } else{ QByteArray response = reply->readAll(); QString responseMsg = QString(response); emit setVolumeFailed( "error: " + responseMsg, reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), reply->rawHeaderPairs()); } } QUrl UDJServerConnection::getActivePlaylistUrl() const{ return QUrl(getServerUrlPath() + "players/" + QString::number(playerId) + "/active_playlist"); } QUrl UDJServerConnection::getCurrentSongUrl() const{ return QUrl(getServerUrlPath() + "players/" + QString::number(playerId) + "/current_song"); } QUrl UDJServerConnection::getCreatePlayerUrl() const{ return QUrl(getServerUrlPath()+ "players/player"); } QUrl UDJServerConnection::getPlayerStateUrl() const{ return QUrl(getServerUrlPath()+ "players/" + QString::number(playerId) + "/state"); } QUrl UDJServerConnection::getLibModUrl() const{ return QUrl(getServerUrlPath()+ "/players/" + QString::number(playerId) + "/library"); } QUrl UDJServerConnection::getVolumeUrl() const{ return QUrl(getServerUrlPath()+ "players/" + QString::number(playerId) + "/volume"); } QUrl UDJServerConnection::getPlayerLocationUrl() const{ return QUrl(getServerUrlPath()+ "players/" + QString::number(playerId) + "/location"); } QUrl UDJServerConnection::getPlayerPasswordUrl() const{ return QUrl(getServerUrlPath()+ "players/" + QString::number(playerId) + "/password"); } QUrl UDJServerConnection::getParticipantsUrl() const{ return QUrl(getServerUrlPath()+ "players/"+QString::number(playerId)+"/users"); } bool UDJServerConnection::isResponseType(QNetworkReply *reply, int code){ return reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == code; } bool UDJServerConnection::isGetActivePlaylistReply(const QNetworkReply *reply) const{ return reply->request().url().path() == getActivePlaylistUrl().path() && !reply->property(getSongsRemovedPropertyName()).isValid() && !reply->property(getSongsAddedPropertyName()).isValid(); } bool UDJServerConnection::isModActivePlaylistReply(const QNetworkReply *reply) const{ return reply->request().url().path() == getActivePlaylistUrl().path() && reply->property(getSongsRemovedPropertyName()).isValid() && reply->property(getSongsAddedPropertyName()).isValid(); } bool UDJServerConnection::isPasswordSetReply(const QNetworkReply *reply) const{ return reply->request().url().path() == getPlayerPasswordUrl().path() && reply->operation() == QNetworkAccessManager::PostOperation; } bool UDJServerConnection::isPasswordRemoveReply(const QNetworkReply *reply) const{ return reply->request().url().path() == getPlayerPasswordUrl().path() && reply->operation() == QNetworkAccessManager::DeleteOperation; } }//end namespace UDJ-Desktop-Client-0.6.4/src/PlaybackWidget.cpp0000664000175000017500000001755712051252546020622 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "PlaybackWidget.hpp" #include #include #include #include #include #include #include #include #include #include "Logger.hpp" #include #include "PlaybackErrorMessage.hpp" namespace UDJ{ PlaybackWidget::PlaybackWidget(DataStore *dataStore, QWidget *parent): QWidget(parent), dataStore(dataStore), currentPlaybackState(PLAYING) { currentSongTitle = ""; currentSongArtist = ""; currentSongDuration = ""; audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); mediaObject = new Phonon::MediaObject(this); createActions(); setupUi(); Phonon::createPath(mediaObject, audioOutput); audioOutput->setVolume(dataStore->getPlayerVolume()); mediaObject->setTickInterval(1000); connect( audioOutput, SIGNAL(volumeChanged(qreal)), dataStore, SLOT(setVolume(qreal))); connect( dataStore, SIGNAL(volumeChanged(qreal)), audioOutput, SLOT(setVolume(qreal))); connect(mediaObject, SIGNAL(tick(qint64)), this, SLOT(tick(qint64))); connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged(Phonon::State, Phonon::State))); connect(mediaObject, SIGNAL(currentSourceChanged(Phonon::MediaSource)), this, SLOT(sourceChanged(Phonon::MediaSource))); connect(mediaObject, SIGNAL(finished()), this, SLOT(playNextSong())); connect( mediaObject, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged())); connect( dataStore, SIGNAL(manualSongChange(DataStore::song_info_t)), this, SLOT(setNewSource(DataStore::song_info_t))); connect( dataStore, SIGNAL(activePlaylistModified()), this, SLOT(handlePlaylistChange())); connect( dataStore, SIGNAL(playerStateChanged(const QString&)), this, SLOT(onPlayerStateChanged(const QString&))); } void PlaybackWidget::tick(qint64 time){ QTime tickTime(0, (time/60000)%60, (time/1000)%60); timeLabel->setText(tickTime.toString("mm:ss")+"/"+currentSongDuration); } void PlaybackWidget::sourceChanged(const Phonon::MediaSource &/*source*/){ } void PlaybackWidget::metaDataChanged(){ } void PlaybackWidget::stateChanged( Phonon::State newState, Phonon::State /*oldState*/) { if(newState == Phonon::ErrorState && mediaObject->currentSource().type() != Phonon::MediaSource::Empty && mediaObject->currentSource().type() != Phonon::MediaSource::Invalid) { Logger::instance()->log("Playback error: " + mediaObject->errorString()); if(mediaObject->errorType() == Phonon::FatalError){ informBadSong(); playNextSong(); } } } void PlaybackWidget::informBadSong(){ if(!DataStore::getDontShowPlaybackErrorSetting()){ PlaybackErrorMessage *errorMessage = new PlaybackErrorMessage("Couldn't Play Song", tr("Sorry, but we couldn't figure out how to play \"") + currentSongTitle + "\".", this); errorMessage->show(); } } void PlaybackWidget::playNextSong(){ DataStore::song_info_t nextSong = dataStore->takeNextSongToPlay(); mediaObject->setCurrentSource(nextSong.source); if(nextSong.source.type() != Phonon::MediaSource::Empty && nextSong.source.type() != Phonon::MediaSource::Invalid) { setSongInfo(nextSong); mediaObject->play(); } else{ //Nothing left to play at the moment. clear the current song. if(dataStore->getCurrentSongId() != -1){ Logger::instance()->log("playback widget is clearing current song"); dataStore->clearCurrentSong(); clearWidget(); } } } void PlaybackWidget::handlePlaylistChange(){ if((mediaObject->currentSource().type() == Phonon::MediaSource::Empty || mediaObject->currentSource().type() == Phonon::MediaSource::Invalid) && currentPlaybackState != PAUSED) { playNextSong(); } } void PlaybackWidget::setupUi(){ songInfo = new QLabel(this); timeLabel = new QLabel("--:--", this); QToolBar *bar = new QToolBar; bar->addAction(playAction); bar->addAction(pauseAction); bar->addAction(skipAction); volumeSlider = new Phonon::VolumeSlider(this); volumeSlider->setAudioOutput(audioOutput); volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); seekSlider = new Phonon::SeekSlider(this); seekSlider->setMediaObject(mediaObject); QHBoxLayout *infoLayout = new QHBoxLayout; infoLayout->addWidget(songInfo); infoLayout->addStretch(); infoLayout->addWidget(timeLabel); QHBoxLayout *playBackLayout = new QHBoxLayout; playBackLayout->addWidget(bar); playBackLayout->addStretch(); playBackLayout->addWidget(volumeSlider); QHBoxLayout *seekerLayout = new QHBoxLayout; seekerLayout->addWidget(seekSlider); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(infoLayout); mainLayout->addLayout(seekerLayout); mainLayout->addLayout(playBackLayout); setLayout(mainLayout); } void PlaybackWidget::togglePlaybackState(){ if(currentPlaybackState == PLAYING){ pause(); dataStore->pausePlayer(); } else{ play(); dataStore->playPlayer(); } } void PlaybackWidget::play(){ currentPlaybackState = PLAYING; mediaObject->play(); playAction->setEnabled(false); pauseAction->setEnabled(true); skipAction->setEnabled(true); } void PlaybackWidget::pause(){ Logger::instance()->log("Setting playback widget as paused"); currentPlaybackState = PAUSED; mediaObject->pause(); playAction->setEnabled(true); pauseAction->setEnabled(false); skipAction->setEnabled(false); } void PlaybackWidget::onPlayerStateChanged(const QString& newState){ if(newState == DataStore::getPlayingState()){ play(); } else if(newState == DataStore::getPausedState()){ pause(); } } void PlaybackWidget::createActions(){ playAction = new QAction(style()->standardIcon(QStyle::SP_MediaPlay), tr("Play"), this); playAction->setShortcut(tr("Ctrl+P")); playAction->setEnabled(false); pauseAction = new QAction(style()->standardIcon(QStyle::SP_MediaPause), tr("Pause"), this); pauseAction->setShortcut(tr("Ctrl+A")); skipAction = new QAction(style()->standardIcon(QStyle::SP_MediaSkipForward), tr("Skip"), this); connect(playAction, SIGNAL(triggered()), dataStore, SLOT(playPlayer())); connect(playAction, SIGNAL(triggered()), this, SLOT(play())); connect(pauseAction, SIGNAL(triggered()), dataStore, SLOT(pausePlayer())); connect(pauseAction, SIGNAL(triggered()), this, SLOT(pause())); connect(skipAction, SIGNAL(triggered()), this, SLOT(playNextSong())); } void PlaybackWidget::setNewSource(DataStore::song_info_t newSong){ setSongInfo(newSong); Logger::instance()->log("in set new source"); mediaObject->setCurrentSource(newSong.source); if(currentPlaybackState == PAUSED){ Logger::instance()->log("in paused state, need to set to playing"); dataStore->playPlayer(); } play(); } void PlaybackWidget::clearWidget(){ mediaObject->stop(); songInfo->setText(""); timeLabel->setText("--:--"); } void PlaybackWidget::setSongInfo(const DataStore::song_info_t& newSong){ currentSongTitle = newSong.title; currentSongArtist = newSong.artist; currentSongDuration = newSong.duration; songInfo->setText(newSong.title + " - " + newSong.artist); } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/ParticipantsModel.cpp0000664000175000017500000000442212051252546021335 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "ParticipantsModel.hpp" #include "DataStore.hpp" #include "Logger.hpp" namespace UDJ{ ParticipantsModel::ParticipantsModel(DataStore* dataStore, QObject *parent) :QStandardItemModel(parent), dataStore(dataStore) { setHeaders(); connect( dataStore, SIGNAL(newParticipantList(const QVariantList&)), this, SLOT(onNewParticipantList(const QVariantList&))); } void ParticipantsModel::onNewParticipantList(const QVariantList& newParticipants){ removeRows(0, rowCount()); setHeaders(); QVariantMap participant; for(int i=0; i newRow; newRow << newId << newUsername << newFirstName << newLastName; appendRow(newRow); } } QString ParticipantsModel::getAttrWithDefault( const QVariantMap& user, const QString& attr, const QString& defaultValue) { QString value = user[attr].toString(); if(value == ""){ return defaultValue; } return value; } void ParticipantsModel::setHeaders(){ QStringList headers; headers << tr("Id") << tr("Username") << tr("First Name") << tr("Last Name"); setHorizontalHeaderLabels(headers); } } // end namespace UDJ-Desktop-Client-0.6.4/src/SetLocationDialog.cpp0000664000175000017500000000411212051252546021253 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "SetLocationDialog.hpp" #include "DataStore.hpp" #include "AddressWidget.hpp" #include namespace UDJ{ SetLocationDialog::SetLocationDialog(DataStore *dataStore, QWidget *parent, Qt::WindowFlags f) :DialogWithLoaderWidget( tr("Setting Player Location..."), tr("Set Location"), tr("Cancel"), false, parent, f), dataStore(dataStore) { setWindowTitle(tr("Set Player Location")); setModal(true); setupUi(); } void SetLocationDialog::accept(){ QString badInputs = addressWidget->getBadInputs(); if(badInputs == ""){ this->showLoadingText(); dataStore->setPlayerLocation( addressWidget->getStreetAddress(), addressWidget->getCity(), addressWidget->getState(), addressWidget->getZipcode() ); closeDialog(); } else{ QMessageBox::critical( this, tr("Bad Address"), tr("The address you supplied is invalid. Please correct " "the following errors:\n\n") + badInputs ); } } void SetLocationDialog::setupUi(){ if(dataStore->hasLocation()){ addressWidget = new AddressWidget( 0, dataStore->getLocationStreetAddress(), dataStore->getLocationCity(), dataStore->getLocationState(), QString::number(dataStore->getLocationZipcode())); } else{ addressWidget = new AddressWidget(); } setMainWidget(addressWidget); } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/AboutWidget.hpp0000664000175000017500000000217412051252546020140 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef ABOUT_WIDGET_HPP #define ABOUT_WIDGET_HPP #include namespace UDJ{ /** * \brief Widget used to display information about the UDJ Client */ class AboutWidget : public QWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Creates an About widget. * * \param parent The parent widget (if any). */ AboutWidget(QWidget *parent=0); //@} }; }//end namspace UDJ #endif //ABOUT_WIDGET_HPP UDJ-Desktop-Client-0.6.4/src/Logger.hpp0000664000175000017500000000435112051252546017140 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef LOGGER_HPP_ #define LOGGER_HPP_ #include #include namespace UDJ{ /** * \brief Singleton class used to keep a log of messages */ class Logger : public QObject{ Q_OBJECT public: /** @name Creation/Destruction Functions */ //@{ /** * \brief Retrieves an instance of the logger. * * \return An instance of the logger. */ static Logger* instance(); /** * \brief Deletes the instance of the logger. This should only be called when the program * is finished and there is no more intent of logging things. */ static void deleteLogger(); //@} /** @name Log Functoins */ //@{ /** * \brief Adds the given message to the log. * * \param message Message to add to the log. */ void log(QString message); /** * \brief Gets the current log of messages. * * \return The current log of messages. */ QStringList getLog(); //@} signals: /** @name Signals */ //@{ /** * \brief Emitted when ever a message is added to the log. * * \param newLogLine The new message that was added to the log. */ void dataChanged(const QString& newLogLine); //@} private: /** @name Constructor(s) */ //@{ /** \brief . */ Logger():QObject(){}; /** \brief . */ Logger(Logger const&):QObject(){}; /** \brief . */ Logger& operator=(Logger const&); //@} /** Private Members */ //@{ /** \brief Singelton instance of the log */ static Logger* myInstance; /** \brief Actual data in the log*/ QStringList data; //@} }; } #endif //LOGGER_HPP_ UDJ-Desktop-Client-0.6.4/src/LogViewer.hpp0000664000175000017500000000250412051252546017622 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef LOG_VIEWER_HPP #define LOG_VIEWER_HPP #include namespace UDJ{ /** * \brief A quick and dirty widget for viewing the contents of the log */ class LogViewer : public QTextEdit{ Q_OBJECT public: /** @name Constructor(s) */ //@{ /** * \brief Constructs a LogViewer. * * \param parent The parent widget. */ LogViewer(QWidget *parent=0); //@} private slots: /** @name Private Slots */ //@{ /** * \brief Updates the text in the log view. * * \param newLogLine The new text to be added to the log view. */ void updateText(const QString& newLogLine); //@} }; } #endif //LOG_VIEWER_HPP UDJ-Desktop-Client-0.6.4/src/ParticipantsView.hpp0000664000175000017500000000272112051252546021214 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef PARTICIPANTS_VIEW_HPP #define PARTICIPANTS_VIEW_HPP #include "ConfigDefs.hpp" #include "DataStore.hpp" #include namespace UDJ{ class ParticipantsModel; class ParticipantsView : public QTableView{ Q_OBJECT public: /** @name Constructors */ //@{ ParticipantsView(DataStore* dataStore, QWidget* parent=0); //@} private: /** @name Private Members */ //@{ /** * \brief The data store containing music that could potentially be added * to the playlist. */ DataStore* dataStore; ParticipantsModel *participantsModel; //@} /** @name Private Functions */ //@{ /** * \brief Configures how the headers in the view should look. */ void configureHeaders(); //@} }; } //end namespace #endif //PARTICIPANTS_VIEW_HPP UDJ-Desktop-Client-0.6.4/src/udjlauncher.ico0000664000175000017500000540465612051252546020231 0ustar kurtiskurtis hv  f@@ (B (6a ( ^i ((  ۬-"'"'1111111111.=% H8 J:.,v,{,ˠ,.....-Ӧ("ʞ&#f%$( ( ( ) (E8(*++++(߮'߮'oX' ( ( ( (,$$8$$8('߮'aM'ޮ&ޭ%ݬ$|$ ' ( ( ( ( ( (##733C'ң$N>&ݫ#ݬ!ܫ!2)% ( ( (3230 ( 5/{a#M=$۫ ۪ɜ ' ( (5-]]p;;R""7 ( (,8-$M=$ڨڨ ( ( (.33K )3 ( (!&M<#ئئ ( ) (&&: *1, ( ()!$L;!ե֤գ%6 ( (..?.51 ( ( (]IK; ԡԢӡhQ/11A ( ( ( ( ( ( ( 'B3ɚӠ ҟ ˚ -$"522B, ( ( ( ( 'dM %uџ О О >1*0+ ( ( 'jQО О tϝϝΜΜΜΜr]G8,@2mT ΜΜΜΜΛ̙͚͚͚͚͚͚͚͚͚͚͚͚͚͚vaHghhhhhhhhhhhgjO/"L(0 -Oܭ.ǜ+͢+ݮ/ǝ*͢+111111111111111/} /Ӟ| 7+ g6+ Ȟ)/////////////0/.8.h]H%-+qZ)_L)dP)l*΢+--------+d+է(lӦ(lrh(!( ( ( ( ( ( (J;()ݭ+++++++k)(((((C7( ( ( ( ( (+12*(y_(ݬ((()ę))k'߮'߮'߮''*"' ( ( ( ( ( ( (+((;88E2(dO'߮'߮'UD'x'$kޭ$ݬ$ݬ$ϡ$K<% ' ( ( ( ( ( ( ( ( (4EEN1'n$۪$N>&u%ެ$kݬ"ݬ"ݬ"t#& ( ( ( ( ( )1/ ( ( ( 588F+?3%˞"N>%t$ެ!kܫ ܫ ܫ 6+$ ' ( ( ( (2));.0,,>, ( ( 5 6 '!M=$t"۬k۪ک˞ ' ( ( ( (1##7/,,E%%?*11A ( ( (1 (cM"M=$s!۩kڨ٨v ( ( ( ( (33B+mm~??V11 ( ( ( (8-#M=#r٩k٨٧g ( ( ( ( (06~~*))< ( ( ( (-$$M<#q٧kئ֥q ( ( ( ( (..@ )ttOOc/4 ( ( ( (6+#L;!p٤k֥֤ &+, ( (((;&&:,PPd66M+((; ( ( ( ( (^HK;!o֤k֤գգ-$"+**= ( ( (466D/3..?* ( ( ( ( 'K; o֢kԢӡӡg &));55D* ( ( ( ( ( ( ( ( ( ( '3(!H8kҠkӡҠ Ҡ ”A3 '22B44C+ ( ( ( ( ( ( ( ( (%du  O< kҠ ҟ ҟ ў {$)**<77E1 ( ( ( ( ( ( ( 'TAɘ ’ >0{^Ș kџ О О О О x&! &.!!53+ ( ( ( '%XCО О О uYzϝkОϝϝϝϝϝ dM&! & ( ( ( '$?2jȗϝϝϝϝϝϛkϝΜΜΜΜΜΜȗ{ lRS@[Ff ΛΜΜΜΜΜΜϛkʙ͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚ȖxjdtwZ4&I7)M:O:O:O:O:O:O:O:O:O:O:O:O:O:O:O:O:O:N:@/( @ *11222222222222222222222222210,/1z %B4 ը-y $@3 ت.111111111111111111110//kk/////////////////////*+--) x&~--,jT*M>)D7)I;)^K*s*ש,-----------,L,,ś%lTmݮ+ƛ&jSlէ*bN)( ( ( ( ( ( ( ( (D7(*,,,,,,,,,߮*O********s(( ( ( ( ( ( (*+ ( ( ( (ZH(********߮*O(((((((gR( ( ( ( ( ( ( ( (-!!7**<))<. ( (2)(ڪ((((w^(qY((߮'O'߮'߮'߮'߮'߮'lU' ( ( ( ( ( ( ( ( ( ( (+..?DDM11A ( (1('߮'߮'߮'O@'N>'߮'߮#O߮%ޭ%ޭ%ޭ%ޭ%}% ' ( ( ( ( ( ( ( ( ( ( ( ( (1VVY==J ( (TB%ޭ%ޭ%O?&M>&ޭ%߫#Oޭ#ݬ#ݬ#ݬ#ݬ#"& ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.RRX44C ( '#ݬ#O?&M=&ݬ#۫ Oݬ"ݬ"ݬ"ݬ"e# ' ( ( ( ( ( ( ( (0,,>&&: ( ( ( ( (.@@K1 (;0%ݬ"O?%M=%ݬ"۫ Oܫ ܫ ܫ ܫ 3)% ( ( ( ( ( ( (0FFO/,-..?::H ( ( ( ( 5((; ( '˞ N>$L=%ܫ ۫O۪۪۪ѣ ' ( ( ( ( ( (...? ( ( ( ( (/;;H ( ( ( )6* (~b!N>$L=%۪ۨO۩کک{ ( ( ( ( ( ( (RRW ( (uu ( (--? ( ( ( (* ( (L<"N>#L<$کبOڨ٨٨|a ( ( ( ( ( ( ('': (>>U (+++> ( ( ( ( ( (9.$N=#L<#٨بO٨٧٧tZ ( ( ( ( ( ( (1 (zz (+00A ( ( ( ( ( (5*$N=#L<#٧إOئצצc ( ( ( ( ( ( (11B (1 (,((; ( ( ( ( ( (;0#M>J ( ( ( ( 'զ#ݬ#ݬ#ݬ# ' (bM%ݬ#ݬ#ݬ#ݪݫ!ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**((;, ( ( (F8$ܪ ܪ ' (aM$ܪ ܪ ܪ ݪک۪۪۪۪۪۪۪$% ( ( ( ( ( ( ( ( ( ( ( ( ( ( (MMTRRX ( ( ( ( ( ( ( ( ( ( (HHQVVZ ( ( ( ( ( ( ( ( (&&:""80 ( ( ( &֦۪ ' (aM#۪۪۪ݪک۪۪۪۪۪۪ɜ ( ( ( ( ( ( ( ( ( ( ( ( ( ( (88FUUZ ( ( ( ( ( ( ( ( ( ( ( ( (PPVIIR ( ( ( ( ( ( ( (030 ( ( ( (۪ ' (aM"۪۪۪ݪککککککک ( ( ( ( ( ( ( ( ( ( ( ( ( ( (aab/ ( ( ( (0YYlYYm88O ( ( ( ( )dde. ( ( ( ( ( ( (*/, ( ( ( (zک ' (aL"کککݪ٩کککککک~ ( ( ( ( ( ( ( ( ( ( ( ( ( (==ICCM ( ( ( (RRfZZn ( ( ( (((;IIQ ( ( ( ( ( ( ( (* ( ( ( ( (aM!ک ' (aL"کککݪ٩ڨڨڨڨڨڨmV! ( ( ( ( ( ( ( ( ( ( ( ( ( (PPV 6 ( ( (,OOd ( ( (.__a ( ( ( ( ( ( ( ( ( ( ( ( ( (?1#ڨ ' (aL"ڨڨڨݪ٧٨٨٨٨٨٨UC! ( ( ( ( ( ( ( ( ( ( ( ( ( (``b+ ( ( ( ( ( ( (ddd ( ( ( ( ( ( ( ( ( ( ( ( ( (*"%٨ ' (aL"٨٨٨ݪ٧٧٧٧٧٧٧K<" ( ( ( ( ( ( ( ( ( ( ( ( ( (bbc ) ( ( ( ( ( ( (eee ( ( ( ( ( ( ( ( ( ( ( ( ( (!%٧ ' (aK!٧٧٧ݪ٦ااااااN=! ( ( ( ( ( ( ( ( ( ( ( ( ( (bbc) ( ( ( ( ( ( (eee ( ( ( ( ( ( ( ( ( ( ( ( ( (#%ا ' (aK!اااݪئئئئئئئ\H ( ( ( ( ( ( ( ( ( ( ( ( ( (^^`. ( ( (|| ( ( ( )ccc ( ( ( ( ( ( ( ( ( ( ( ( ( (1(#ئ ' (aK!ئئئݪإצצצצצצb ( ( ( ( ( ( ( ( ( ( ( ( ( (GGQ''; ( ( ( ( ( ( ( (3UUZ ( ( ( ( ( ( ( ( ( ( ( ( ( (J: צ ' (`K צצצݪ֥ץץץץץץ ( ( ( ( ),* ( ( ( ( ( ( (5WW[ ( ( ( ( ( ( ( ( ( (LLS<1! ( ( (+$$9((<3 ( ( ( ( ( ( ( (5ddd2 ( ( ( ( ( ( ( ( (-ZZ^--? ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%֤֤ ' (`J֤֤֤ݙգդդդդդդդv ( ( ( ($$9..@11B ) ( ( ( ( ( ( ( (4aabLLT+ ( ( ( ( ( (JJSccd 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (w\դդ ' (_Jդդդ̙բգգգգգգգɚ ' ( ( (/44C88F**= ( ( ( ( ( ( ( ( ( ())>>JCCN 6 ( ( ( ( ( ( ( ( ( ( (24652 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0&"գգգ ' (_Jգգգ̙ԡԢԢԢԢԢԢԢԢ ' ( ( (*AALGGQIIR. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (zԢԢԢ ' (^JԢԢԢ̙ԡԢԢԢԢԢԢԢԢԢUB ( ( ( ( 5JJSPPWQQW+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0&"ҠԢԢԢ ' (^JԢԢԢ̙ԡӡӡӡӡӡӡӡӡӡǗ ' ( ( ( (,,>QQWVV[VVZ, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'ӡӡwZ  ӡ̙ҡ ӡӡӡӡӡӡӡӡӡӡl ( ( ( ( (33BRRXVV[UUZ2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (pWӡӡӡ 'ӡ̙ҡ ӠӠӠӠӠӠӠӠӠӠҟQ? ( ( ( ( (..@OOVQQWPPW00A ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.%!ОӠӠӠ* cӠ̙џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ϟ $" ( ( ( ( (""7HHQHHQFFPBBL3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%˚ Ҡ Ҡ Ҡ Ҡ О ə % &YEə џ Ҡ ̙џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ϟ % ( ( ( ( ( (::H??K<.s̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙8*(4&nR}^~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~^rU@/%q ( ߟ-U02123333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333321.n$1~2333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333322ۭ$.,2333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331.i.M122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221/*+1222222222|!pXgQlݮ/22222222222~"pXhQlڬ/2222222222222222222222222222222222222222222222222222222222222222222222222222222222222221-w011111111hR E7ݮ/1111111qY B4 ۬.111111111111111111111111111111111111111111111111111111111111111111111111111111111111110,:/}111111112( Ѧ,11111?1 ը,11111111111111111111111111111111111111111111111111111111111111111111111111111111111111/-3/1111111H8!1111`K 011111111111111111111111111111111111111111111111111111111111111111111111111111111111110-O.0000000Ѥ+t[00'm00000000000000000000000000000000000000000000000000000000000000000000000000000000000000-00000000SA,# 00w]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.///////./3' /////////////////////////////////////////////////////////////////////////////////////// ////////ԧ+////////////////////////////////////////////////////////////////////////////////////////ݰ(-.///////./5) ///////////////////////////////////////////////////////////////////////////////////////*<-.......\I1' ..~a...............-ޮ-զ-z*[I(=1($(( ( ( ( ((6+(P@(i*ǜ,ݮ-߯--....................................................-?--------۬,i--ɞ'-----------ܭ-է-d)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((\J(ȝ,٫--------------------------------------------------(?,--------UB+!----oW ,--------ت,+-%( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((h)Ҧ,,---------------------------------------------߮(?,---------:- ڬ*-----O>ګ*------ޮ,+G:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (& (+֨,-------------------------------------------߮(?,,,,,,,,,,,o TB+,,,,,,,o VBޮ+,,,,,ݭ+*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (t[)Ѥ+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,߮(?+,,,,,,,,,,,,Ø$wm",,,,,,,,,,,,Ě%xn"߯+,,,,,۬+|)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (hR(˟+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,߮(?++++++++++++++++++++++++++++++++++++++) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (~c)ܬ++++++++++++++++++++++++++++++++++++++߮(?*+++++++++++++++++++++++++++++++++++™*9.( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (()*+++++++++++++++++++++++++++++++++++߮(?*++++++++++++++++++++++++++++++++++~d) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B4(֨*++++++++++++++++++++++++++++++++++߮(?*********************************Ρ)9-( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )+,.//-+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (()*********************************߮(?)*******************************)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+-.01245 63- ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (}b(********************************߮$?)))))))))))))))))))))))))))))))}c( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*-/02356!!7##9%%:'';'';6, ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>2(ޮ))))))))))))))))))))٪)o)o)ت))))))))߮$?()))))))))))))))))))))))))))))fQ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*,/0235 7##8%%:&&;((<**=,,>--?//@'';. ( ( ( ( ( ( ( ( ( ( ( ( ( (.&(ة))))))))))))))))))ګ)( ( ((٪)))))))߮$?())))))))))))))))))))))))))))RA( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+-04!!7$$9&&:((;**=,,>..@00A22B33C55D66E--?- ( ( ( ( ( ( ( ( ( ( ( ( (#(ʞ)))))))))))))))))oX( ( ( ( (fP())))))߮$?((((((((((((((((((((((((((((E8( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ).4**=--?//@11B33C55D77E88F::G;;H;;I))= ) ( ( ( ( ( ( ( ( ( ( ( ((ǜ((((((((((((((((/&( ( ( ( (;0(((((((߮$?'߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(RB( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.##844D66E88G::H<>K99G ( ( ( ( ( ( ( ( (C5%ܫ"ݬ"ݬ"ݬ"ݬ"ݬ"/&& ( ( ( (:/&ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"۪ ?ݬ!ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ک"' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/022BDDMPPVHHQ;;H1/* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##8CCNAAL??K<>K<>J ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (22B11B//@--?++=""7 ( ( ( ( ( ( ( (F8$ܫ ܫ ܫ ܫ /%& ( ( ( (:/&ܫ ܫ ܫ ܫ ܫ ܫ ۪?ܫܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ 4)$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (22BeeefffOOV* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44CffffffGGQ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (...@,,>**=((;&&:, ( ( ( ( ( ( ( 'С ܪ ܪ ܪ /%& ( ( ( (:/&ܪ ܪ ܪ ܪ ܪ ܪ ۪?ܪ۪۪۪۪۪۪۪۪۪۪۪۪۪۪ԥ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (22Beeefff33C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5bbcfffHHQ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**=))<'';%%9##82 ( ( ( ( ( ( ( ( ۪۪۪.%% ( ( ( (:/%۪۪۪۪۪۪۪?۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪ɜ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!7eeefff,,> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1aabfffBBM ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-&&:$$9""7 64 ( ( ( ( ( ( ( (z_!۪۪۪.%% ( ( ( (:/%۪۪۪۪۪۪ۦ?۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪i ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.bbcfff44C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5eeeeee((; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""8!!6542+ ( ( ( ( ( ( (%%۪۪۪.%% ( ( ( (:/%۪۪۪۪۪۪ۦ?۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪( % ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (KKSfffPPW ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++>fffbbc- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/4310- ( ( ( ( ( ( ( (̞۪۪.%% ( ( ( (:/$۪۪۪۪۪۪ۦ?۪۩۩۩۩۩۩۩۩۩۩۩۩۩צ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5eeeaab* ( ( ( ( ( ( ( ( ( ( ( ( (,,D ( ( ( ( ( ( ( ( ( ( ( ( ( (MMUfff@@L ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*21/.- ( ( ( ( ( ( ( (۩۩.%% ( ( ( (:/$۩۩۩۩۩۩ۦ?۩کککککککککککککС ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (XX\fff66E ( ( ( ( ( ( ( ( ( (7``r ( ( ( ( ( ( ( ( ( (/fffddd/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/.-,+ ( ( ( ( ( ( ( (|کک.%% ( ( ( (:/$ککککککۦ?کککککککککککککک͟ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2fff^^` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (HHQfff44D ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*,+ * ( ( ( ( ( ( ( ( (YG"کک.%% ( ( ( (:/$کککککک֦?کککککککککککککک} ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (AALfffFFO ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3fffaab ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ( ( ( ( ( ( ( ( ( ( (2($کک.%% ( ( ( (:/$کککککک֦?کڨڨڨڨڨڨڨڨڨڨڨڨڨfQ! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (bbcfff- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (\\_fff4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&ڨڨ.%% ( ( ( (:.$ڨڨڨڨڨڨ֦?ڨڨڨڨڨڨڨڨڨڨڨڨڨڨE7# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0fff^^` ( ( ( ( ( ( ( (/ ( ( ( ( ( ( ( (DDOfff&&: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (դڨ.%% ( ( ( (:.$ڨڨڨڨڨڨ֦?٨٨٨٨٨٨٨٨٨٨٨٨٨٨-%$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3fffOOV ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (77FfffCCN ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Π٨.%% ( ( ( (:.$٨٨٨٨٨٨֦?٨٨٨٨٨٨٨٨٨٨٨٨٨٨& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&&:fffMMU ( ( ( ( ( ( ( (. ( ( ( ( ( ( (1fff]]_ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ʝ٨.%% ( ( ( (:.$٨٨٨٨٨٨֦?٨٨٨٨٨٨٨٨٨٨٨٨٨٨& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (66EfffAAL ( ( ( ( ( ( ( (nn ( ( ( ( ( ( (+fff``a ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ț٨.%% ( ( ( (:.$٨٨٨٨٨٨֦?٧٧٧٧٧٧٧٧٧٧٧٧٧٧ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (BBMfff66E ( ( ( ( ( ( ( * ( ( ( ( ( ( (*fffaac ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ƙ٧.%% ( ( ( (:.$٧٧٧٧٧٧֦?٧٧٧٧٧٧٧٧٧٧٧٧٧٧' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (99Hfff??J ( ( ( ( ( ( ( ({{ ( ( ( ( ( ( (*fffaab ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ț٧.%% ( ( ( (:.$٧٧٧٧٧٧֦?اااااااااااااا& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (--?fffLLT ( ( ( ( ( ( ( (''A ( ( ( ( ( ( (.fff__a ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ɛا.%% ( ( ( (:.$اااااا֦?ائئئئئئئئئئئئئ("$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3fffNNV ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (11BfffIIR ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (̝ئ.%% ( ( ( (:.$ئئئئئئ֦?ئئئئئئئئئئئئئئ@3" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1fffZZ] ( ( ( ( ( ( ( (++D ( ( ( ( ( ( ( (CCNfff)); ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ҡئ.%% ( ( ( (:.$ئئئئئئ֦?ئئئئئئئئئئئئئئZG ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (dddfff* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (VVZfff""7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( &ئئ.%% ( ( ( (:.$ئئئئئئ֢?ئצצצצצצצצצצצצצs ( ( ( ( ( ( ( ( ( ( ( ) * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (QQVfff>>J ( ( ( ( ( ( ( ( (. ( ( ( ( ( ( ( (-fffddd ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+##צצ.%% ( ( ( (:.#צצצצצצ֢?צצצצצצצצצצצצצצȚ ( ( ( ( ( ( ( ( ( )*+, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4fffWW\ ( ( ( ( ( ( ( ( ( (+ ( ( ( ( ( ( ( ( (BBMfff>>K ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (M=!צצ.%% ( ( ( (:.#צצצצצצ֢?צץץץץץץץץץץץץץ͝ ( ( ( ( ( ( ( ( )+,-/* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (``afff((; ( ( ( ( ( ( ( ( ( (YYl ( ( ( ( ( ( ( ( ( (*fffeee4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (pץץ.%% ( ( ( (:.#ץץץץץץ֢?ץץץץץץץץץץץץץץҡ ( ( ( ( ( ( ( (*-/01/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""7fffZZ^ ( ( ( ( ( ( ( ( ( ( ( ( (77NNNb ( ( ( ( ( ( ( ( ( ( ( ( (CCNfffOOU ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ץץ.%$ ( ( ( (:.#ץץץץץץ֢?ץץץץץץץץץץץץץץ֤% ( ( ( ( ( ( ( )01234 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (XX\fffCCN ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4fffddd2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ėץץ.%$ ( ( ( (:.#ץץץץץץ֢?ץ֥֥֥֥֥֥֥֥֥֥֥֥֥֥mU ( ( ( ( ( ( ( (0346 7. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3ddefff##7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-bbceee66E ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%֤֥֥-%# ( ( ( (:."֥֥֥֥֥֥֢?֥֤֤֤֤֤֤֤֤֤֤֤֤֤֤Õ ( ( ( ( ( ( ( (.5 7""8$$9##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (00Aeeefff5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+VVZfffOOV ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (bL֤֤֤-%# ( ( ( (:."֤֤֤֤֤֤֢?֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤͝ ( ( ( ( ( ( ( (*!!7##9%%:'';))<. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (CCNeeffff!!6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-VV[fffUUZ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (֤֤֤-%# ( ( ( (:."֤֤֤֤֤֤Ң?֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤$$ ( ( ( ( ( ( ( ( 6&&;((<**=,,?))< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (EEOeeefff77F ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5ccdfffUUZ, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ė֤֤֤-%# ( ( ( (:."֤֤֤֤֤֤Ң?֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤o ( ( ( ( ( ( ( (.))=++>--?//A11B. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (99GeeefffSSY4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+DDNfffeeeOOV ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/&#֤֤֤֤-%# ( ( ( (:."֤֤֤֤֤֤Ң?֤դդդդդդդդդդդդդդդƙ ( ( ( ( ( ( ( ( ('';..@11A33C55D44C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5\\_ffffffLLT((; ( ( ( ( ( ( ( ( ( ( (/AAMffffffccd33C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (wդդդդ,%# ( ( ( (9."դդդդդդҢ?դգգգգգգգգգգգգգգգգ4*" ( ( ( ( ( ( ( (111B33C66E88F::H""8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (66DcccffffffddeEEP>>K))<1+-!!7<ZZ]eeefffffffffffffffffffffffffffeeeaab66E2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (P>գգգգգ,$# ( ( ( (9-"գգգգգգҢ?գգգգգգգգգգգգգգգգգ͝ & ( ( ( ( ( ( ( (.88G;;H==J@@KBBM;;H ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.'';33CQQX]]_^^`^^`XX\==I((;4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (գգգգգ,$# ( ( ( (9-"գգգգգգҢ?գգգգգգգգգգգգգգգգգգd ( ( ( ( ( ( ( ( (**===J@@KBBMDDOGGP00@ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+"#Ӣգգգգգ,$# ( ( ( (9-"գգգգգգҢ ?գԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢș ' ( ( ( ( ( ( ( ()<>J ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '~ӡӡӡӡӡӡN;ӡӡҞ ?ӡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡ & ( ( ( ( ( ( ( ( ( ( (NNUPPVRRXSSXSSYSSXRRXJJR ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'vZӡӡӡӡӡӡӡ| /$ӡӡҞ?ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ f ' ( ( ( ( ( ( ( ( ( ( (KKSNNUOOVOOVOOVNNUMMTKKS..? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?1 Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ >/ ̚ Ӡ Ӡ Ҟ?Ӡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ P> ' ( ( ( ( ( ( ( ( ( ( (CCOKKSKKSKKSJJSIIRHHQGGPDDN/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($О Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ "    ," Μ Ҡ Ҡ Ҡ Ҡ Ҟ?Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ >J<))<'';%%92,* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%xҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ,#" ( ( ( (8, ҟ ҟ ҟ ҟ ҟ ҟ Ξ?ҟ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ 8, ' ( ( ( ( ( ( ( ( ( ( ( ( (2,,?22B11A//@--?,,>**=((;&&:$$9""7 64310.,* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ C4 ( ( ( (F7џ џ џ џ џ џ Ξ?џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ H8 ' ( ( ( ( ( ( ( ( ( ( ( ( ( (/&&:++>**=((<'';%%9##8!!754210.,+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#Ŗ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ  ' ( ( 'zџ џ џ џ џ џ Ξ?џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ rW & ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*2##7##8""7 65321/.,+ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'A3џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ {^)!"*!!}_џ џ џ џ џ џ џ Ξ?џ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў z$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,/2210/-,* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( &vZў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў Ξ?ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ͛ A3 ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*+++* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў Κ?ўО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О k$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'nUϝ О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О Κ?ООООООООООООООООООООООООООООООООООООООlS ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ОООООООООООООООООООООООООООООООООООООΚ?ОНННННННННННННННННННННННННННННННННННННН VB ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/&!qϜННННННННННННННННННННННННННННННННННННННΚ?ННННННННННННННННННННННННННННННННННННННННН aJ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8,wϜННННННННННННННННННННННННННННННННННННННННΚ?ННННННННННННННННННННННННННННННННННННННННННН b # ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%aK НННННННННННННННННННННННННННННННННННННННННННΚ?Нϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝ͛ dM% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'B4wȗϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝΚ?ϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝ˚ n?1 & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '+!!{^ ƖϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝΚ?ϝϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜɘ ~ `L:*! # ' ( ( ( ( ( '$$!>1nT{ ’ϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜΚ?ϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜ̚ǖŔÓÓƖʘϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜΚ?ϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜ’?˚ΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜm?ÓΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛŔ ?xΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛr?XB͚ΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛ͚U@?}]͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛9 œ͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚̙I7&?/ʘ͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚̙ceKʘ͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚̙v\G6Ŕ͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚˘bO} qɗ̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙˘:+z[œ˘̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙ʗl>.9+ vM,i~[K ( .H11121333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333212111x߲-( ._13333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333322/<12333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333310K0v2333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332*0ܢ#13333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333320-D2333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332۶$.222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221$/12222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221ߟ 0`1222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.'12222222222222222222'5*     r[22222222222222222222222)<.    kUڬ/2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220Ԫ0222222222222222222kT ͡,222222222222222222t[(222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222210/11111111111111111%%111111111111111)+" 01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110'!ް.'11111111111111110f ۬.111111111110k ͡+111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011111111111111110|b ۭ.1111111111{`̡+1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110Kޱ,E1111111111111111"!߰/11111111$ۭ/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110.000000000000000Ҧ,VD0000000ݮ. ]I000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/G$/000000000000000fPѤ+000000aM™(00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/.T000000000000000̡+K:00000٫-H8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Ԫ*0000000000000000w/0000l֨-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ެ,.޵).00000000000000/,# #0000@2 $00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/-9///////////////ګ-jS////s[//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////.S///////////////Ѥ+R@///.N>/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////..j///////////////ȝ)?2 ///΢** /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////..t///////////////ɞ)B4 ///Ҧ+0& /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////.-|///////////////Ҧ+UC////TB/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////.................ܬ,qY....|a..............................................................................................................................................................................,................?1 %....J:%......................................ݭ-Ě,,z,i+pY*dO*]J*WF*SC*P@)P@)TC*YG*`M*gR*x_*o+,,͡-...................................................................................................................,................!.....x۫,...............................-+~d*QA)>2),$(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((!(2*(D7)_L)t+ʞ,............................................................................................................,................Ӧ+]J.....ݭ,cN............................š-qY*9.)#( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+$(F9)r+ڬ-.......................................................................................................,.................f ت,......y`΢)........................΢-zb*6,)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%(G:)|+-...................................................................................................,-----------------٪+ qX-------߯,x^---------------------ۭ-j*6,(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($(N?)+------------------------------------------------------------------------------------------------,------------------$8+ ,--------Ȝ';. ޯ,-------------------z*+#(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((F9(ǝ,---------------------------------------------------------------------------------------------,-------------------zݮ+---------- ت+-----------------,<1(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((kV)ܭ-------------------------------------------------------------------------------------------,-------------------,"*"ݮ,------------%.$۬+---------------ت,]K)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((x*----------------------------------------------------------------------------------------,---------------------̟'eO,--------------ܫ+bL,--------------ʟ, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (\J*߮--------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,! 9, ,,,,,,,,,,,,,,,,,,,$:, ܬ*,,,,,,,,,,,,,+Ś*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (SB(٪+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*,,,,,,,,,,,,,,,,,,,,,,,,,߯+c*!   C6 $,,,,,,,,,,,,,,,,,,,,,,,,i.#   C5 ",,,,,,,,,,,,,,߯+*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (K<(ѣ++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ݭ+*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(˟*+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (O@(ӥ+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++΢+J:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (x)߯++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++۬+o)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (`M)ѥ*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++΢*\I( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((x*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) **+** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (E7(Ѥ*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++********************************************************************ݭ*u]) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*++,-../0.+ * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((*********************************************************************(******************************************************************̠)?3( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,,-.//0112330-* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (|b(߯*******************************************************************(*****************************************************************)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,--./0012234456 650* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (D7(Т)*****************************************************************(***************************************************************ܭ*nW( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,-../011233456 6!!7""8##8##9$$9 60 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((****************************************************************߯(**************************************************************Ӧ);0( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,-.//012234556 7!!7##8##9$$9%%:&&:'';((;((< 6. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (za(***************************************************************߯()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))У(& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,-./001233456 6!!7""8##8$$9%%:&&:'';((;))<))=**=++>,,>**=3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (cO(߯))))))))))))))))))))))))))))))))))))))))է)]K(2(((2)(`L(֨))))))))))))))))߯())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ȝ(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,-./001233456 7!!7##8$$9%%:%%:&&;((;((<))=**=++>,,>--?..@..@//A--@ 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (O?(ܬ))))))))))))))))))))))))))))))))))))))( ( ( ( ( ( ( (())))))))))))))߯()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,--/00123445 6!!7""8##8$$9%%:&&:'';((<))<**=++>,,>--?..@//@//A00A11B22B22C11B$$8 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<1(ة))))))))))))))))))))))))))))))))))))ب)!( ( ( ( ( ( ( ($(٩))))))))))))))߯())))))))))))))))))))))))))))))))))))))))))))))))))))))))))( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )**.0123445 6!!7""8##9$$9%%:&&;((;))<**=**=++>--?--?..@//A00B11B22C33C33C44D55D55E44D''; ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,$(ԥ)))))))))))))))))))))))))))))))))))y( ( ( ( ( ( ( ( ( (y()))))))))))))߯()))))))))))))))))))))))))))))))))))))))))))))))))))))))))r) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*,04!!7""8##9%%:&&:'';((<))<**=++>,,?--?..@//A00A11B22C33C44D44D55E66E77F77F88F88G77E5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((Ϣ))))))))))))))))))))))))))))))))))ZH( ( ( ( ( ( ( ( ( (aM()))))))))))))߯(((((((((((((((((((((((((((((((((((((((((((((((((((((((((rZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*1$$9'';((<))=**=++>--?..@//@00A11B22B33C44D55D66E66E77F88F88G99G::H::H;;H;;I55E, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((ʝ((((((((((((((((((((((((((((((((()"( ( ( ( ( ( ( ( ( (4+((((((((((((((߯&(((((((((((((((((((((((((((((((((((((((((((((((((((((((h( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+5++>--?..@//A00A11B22C33C44D55E77F77F88G99G99H::H;;I<>K>>K??K@@L@@L@@L>>K3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((ڪ((((((((((((((((((((((((((((((((!( ( ( ( ( ( ( ( ( (3*((((((((((((((߯&߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-11A55E66E77F99G::H;;H<>K??K??K@@LAALAAMAAMBBMBBMBBNBBM<>K??K@@LAALAAMBBMCCNCCNDDODDOEEOEEPEEPFFPFFPFFP- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ("(ޮ'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'(!( ( ( ( ( ( ( ( ( (3*(߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯&߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'ҥ'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5<%ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$(!' ( ( ( ( ( ( ( ( (3)'ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ݭ"ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ZG% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (::HWW\VV[TTZSSYQQXPPWNNVMMUKKTJJSHHRGGQ44D ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$(!' ( ( ( ( ( ( ( ( (2)'ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ʝ# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (CCNUUZSSYRRXQQWOOVNNULLTKKTIISHHQGGQEEO!!7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (F8&ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#(!' ( ( ( ( ( ( ( ( (2)'ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#cN% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (IIQRRXQQXPPWNNVMMUKKTJJSIIRGGQFFPDDOBBM. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#(!' ( ( ( ( ( ( ( ( (2)'ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ϡ# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )LLTPPWNNVMMULLTKKSIIRHHQGGQEEPDDOBBN??K ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N>%ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#(!' ( ( ( ( ( ( ( ( (2)'ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ܫ#lV% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,NNUMMUKKTJJSIIRHHQFFPEEPDDOBBNAAM??L..? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#(!' ( ( ( ( ( ( ( ( (2)'ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"Ӥ" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3KKTJJSIIRHHQGGQEEPDDOCCNAAM@@L??K==J, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (WE&ܫ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"(!' ( ( ( ( ( ( ( ( (2)&ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݫ ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ܫ"x^$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (//@IIRHHQGGQEEPDDOCCNBBM@@L??K>>K<>K==J;;I::H4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (`L%ܫ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"(!' ( ( ( ( ( ( ( ( (2)&ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݫ ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"ݬ"i$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (- 6==JTTYeeeffffffffffffffffffffffffffffffbbcKKS33B0+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-CCMDDOCCNBBMAAL??K>>K==J<>K==J<>K==J<, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!( ' ( ( ( ( ( ( ( ( (2)&ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!۫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-->ddefffffffffffffffXX\,,> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-==JbbcfffffffffffffffUUZ. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('':55E44D33C22C11B00A//@..@--?++>''; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (H:%ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ( ' ( ( ( ( ( ( ( ( (2)&ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ r" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (DDNeeeffffffffffffddd22B ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/HHQfffffffffffffffdde''; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )11A33C22B00B//A..@--?,,?++>))=((;, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ѣ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ( ' ( ( ( ( ( ( ( ( (2)&ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ !& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (OOVffffffffffffeeeGGP- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##9\\_fffffffffffffff00A ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!711B00A//A..@--?,,>++>**=((<'';##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ( ' ( ( ( ( ( ( ( ( (2)&ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*UUZfffffffffffffff,,> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*KKSfffffffffffffff99H ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )--?..@--?--?++>**=))=((<'';&&:$$9* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (L=%ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ( ' ( ( ( ( ( ( ( ( (2)&ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ۩۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )WW\ffffffffffff``b1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (11Aeeefffffffffeee::H ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 6--?,,>++>**=))<((<'';%%:$$9##95 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ק ۪ ۪ ۪ ۪ ۪ ۪ ۪ ' ' ( ( ( ( ( ( ( ( (2)&۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۩۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪]I$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (RRXffffffffffffZZ^+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($$8ddefffffffffeee22B ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )**=**=))=((<'';&&;%%:$$9##8""8 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Π۪۪۪۪۪۪۪' & ( ( ( ( ( ( ( ( (2)%۪۪۪۪۪۪۪۪۪۪۪۪۪۩۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (JJSffffffffffffRRX) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2ddefffffffffdde''; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (6))<((;'';&&:%%:$$9""8!!7 76. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ({!۪۪۪۪۪۪۪' & ( ( ( ( ( ( ( ( (2)%۪۪۪۪۪۪۪۪۪۪۪۪۪۩۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (88GffffffffffffXX] ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2eeefffffffffbbc, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )&&:&&:%%:$$9##9""8!!7 6552 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (;0%۪۪۪۪۪۪۪' & ( ( ( ( ( ( ( ( (2)%۪۪۪۪۪۪۪۪۪۪۪۪۪۩۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""7dddfffffffff^^a+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (6ffffffffffffYY\ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5$$9##9##8!!7!!765442 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ب۪۪۪۪۪۪' & ( ( ( ( ( ( ( ( (2)%۪۪۪۪۪۪۪۪۪۪۪۪۪۩۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪Q@# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*``afffffffffeee- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**=ffffffffffffHHP ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,##8""8!!7 6654332. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ӥ۪۪۪۪۪۪' & ( ( ( ( ( ( ( ( (2)%۪۪۪۪۪۪۪۪۪۪۪۪۪۩۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪"& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (CCNffffffffffff""7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (RRXfffffffffeee4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5 665543221/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (q ۪۪۪۪۪۪' & ( ( ( ( ( ( ( ( (2)%۪۪۪۪۪۪۪۪۪۪۪۪۪۩۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (6eeefffffffff;;I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )ffffffffffffWW\ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1554322110/ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((!&۪۪۪۪۪۪' & ( ( ( ( ( ( ( ( (2)%۪۪۪۪۪۪۪۪۪۪۪۪۪۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (WW\fffffffff__a ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0fffffffffeee77F ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )43321100/.+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ڨ۩۩۩۩۩' & ( ( ( ( ( ( ( ( (2)%۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩v]" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((;fffffffffeee!!7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,.%%?UUiCCY1.+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (LLTfffffffff__a ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (02110//.--+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ڨ۩۩۩۩۩' & ( ( ( ( ( ( ( ( (2)%۩۩۩۩۩۩۩۩۩۩۩۩۩۩ککککککککککککککککککککککککککککک<0% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (YY]fffffffffGGP ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( * :\\n1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,eeefffffffff77F ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,10//.--,++ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (եککککک' & ( ( ( ( ( ( ( ( (2)%ککککککککککککک٩ککککککککککککککککککککککککککککک' & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%%9fffffffffeee2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )77O4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (99Gfffffffff]]` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (./.--,,+* * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (r ککککک' & ( ( ( ( ( ( ( ( (2)%ککککککککککککک٩ککککککککککککککککککککککککککککک' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (TTYfffffffffHHQ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!<+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-eeefffffffff//A ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-.-,,+** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (I:$ککککک' & ( ( ( ( ( ( ( ( (2)%ککککککککککککک٩ککککککککککککککککککککککککککککק ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0fffffffffeee4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@@V3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>>KfffffffffPPW ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+,,+** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('ککککک' & ( ( ( ( ( ( ( ( (2)%ککککککککککککک٩کککککککککککککککککککککککککککک ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44DfffffffffRRY ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ffx%%? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0fffffffffeef. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++* ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ککککک' & ( ( ( ( ( ( ( ( (2)%ککککککککککککک٩ککککککککککککککککککککککککککککq ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (^^`fffffffff00A ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (SSf4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (YY]fffffffff77F ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ککککک' & ( ( ( ( ( ( ( ( (2)%ککککککککککککک٩ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨhR! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1fffffffffccd, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (11I, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-->fffffffffRRX ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ڨڨڨڨڨ' & ( ( ( ( ( ( ( ( (2)%ڨڨڨڨڨڨڨڨڨڨڨڨڨ٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨE6$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (__afffffffff%%9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ڨڨڨڨ' & ( ( ( ( ( ( ( ( (2)%ڨڨڨڨڨڨڨڨڨڨڨڨڨ٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ0'% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )dddfffffffff5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (AAMfffffffff;;H ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ({ڨڨڨڨ' & ( ( ( ( ( ( ( ( (2)%ڨڨڨڨڨڨڨڨڨڨڨڨڨ٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨' & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-fffffffffccc ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (uu))B ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('':fffffffffIIR ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (c ٨٨٨٨' & ( ( ( ( ( ( ( ( (1)%٨٨٨٨٨٨٨٨٨٨٨٨٨٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2fffffffffXX\ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )ll} ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4fffffffffWW\ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (`K!٨٨٨٨' & ( ( ( ( ( ( ( ( (1)%٨٨٨٨٨٨٨٨٨٨٨٨٨٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""7fffffffffLLU ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.fffffffffddd ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (G9#٨٨٨٨' & ( ( ( ( ( ( ( ( (1)%٨٨٨٨٨٨٨٨٨٨٨٨٨٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (33CfffffffffAAL ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (]]p9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (dddfffffffff/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=1$٨٨٨٨' & ( ( ( ( ( ( ( ( (1)%٨٨٨٨٨٨٨٨٨٨٨٨٨٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (;;Ifffffffff99G ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (77O ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (]]`fffffffff2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2)%٨٨٨٨' & ( ( ( ( ( ( ( ( (1)%٨٨٨٨٨٨٨٨٨٨٨٨٨٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (BBMfffffffff44C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (II^ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (XX\fffffffff5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*"%٧٧٧٧' % ( ( ( ( ( ( ( ( (1(%٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (IIRfffffffff..? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ZZn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (RRXfffffffff##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&٧٧٧٧' % ( ( ( ( ( ( ( ( (1(%٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (LLTfffffffff,,> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (aat ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (PPWfffffffff$$9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&٧٧٧٧' % ( ( ( ( ( ( ( ( (1(%٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (EEOfffffffff11A ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (OOe ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (VVZfffffffff 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%&٧٧٧٧' % ( ( ( ( ( ( ( ( (1(%٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>>Kfffffffff77F ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>>U ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (\\_fffffffff4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/&%٧٧٧٧' % ( ( ( ( ( ( ( ( (1(%٧٧٧٧٧٧٧٧٧٧٧٧٧٧اااااااااااااااااااااااااااا' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (77Ffffffffff==I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (--E ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (bbbfffffffff1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8-$اااا' % ( ( ( ( ( ( ( ( (1(%اااااااااااااקاااااااااااااااااااااااااااا& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())fffffffffdde0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (֤ץץץץץ'% ( ( ( ( ( ( ( ( (1($ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץv ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+../0011223 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-cccfffffffffFFP ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+ddefffffffffKKS ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (֤ץץץץץ'% ( ( ( ( ( ( ( ( (1($ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץΞ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*//011223340 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44Cffffffffffff!!6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (KKSfffffffffaac- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('֤ץץץץץ'% ( ( ( ( ( ( ( ( (1($ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץ& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/1122334556 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )WW[fffffffff__a- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**>K ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (__afffffffffccd/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ѡ֥֥֥֥֥֥&% ( ( ( ( ( ( ( ( (1($֥֥֥֥֥֥֥֥֥֥֥֥֥ե֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥Р ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2456 6!!7""8##8##9$$9$$9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (QQWffffffffffff33C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ([[^ffffffffffff,,> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&դ֥֥֥֥֥֥&% ( ( ( ( ( ( ( ( (1($֥֥֥֥֥֥֥֥֥֥֥֥֥ե֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.5 6 7!!7##8##9$$9%%:&&:'';2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,``afffffffffeef**= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (VV[eeffffffffffKKS ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (t[֥֥֥֥֥֥֥&% ( ( ( ( ( ( ( ( (1($֥֥֥֥֥֥֥֥֥֥֥֥֥ե֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤7,# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) 6!!7""8##8$$9%%:&&:'';((;))<((< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0ccdfffffffffeee44C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ZZ]eeefffffffffVV[ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Õ֤֤֤֤֤֤֤&% ( ( ( ( ( ( ( ( (1($֤֤֤֤֤֤֤֤֤֤֤֤֤գ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤q ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4##8$$9%%:%%:&&;((;((<))=**=++>2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4eeeffffffffffffAAM ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (]]_ffffffffffff__` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ϟ֤֤֤֤֤֤֤&% ( ( ( ( ( ( ( ( (1($֤֤֤֤֤֤֤֤֤֤֤֤֤գ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/$$9%%:&&:'';((<))<**=++>,,?--?,,= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##9eeeffffffffffff\\_ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5cccffffffffffffccc ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%%գ֤֤֤֤֤֤֤&% ( ( ( ( ( ( ( ( (1(#֤֤֤֤֤֤֤֤֤֤֤֤֤գ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##8'';((<))=**=++>,,?--?//@//A00B2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2ccdffffffffffffeee. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@@Lfffffffffffffff__a ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (d֤֤֤֤֤֤֤֤&% ( ( ( ( ( ( ( ( (1(#֤֤֤֤֤֤֤֤֤֤֤֤֤գ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤UB ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0))<**=++>,,>--?..@//@00A11B22C//@ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-aacfffffffffffffffPPW ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3``bfffffffffffffffTTZ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Õ֤֤֤֤֤֤֤֤&% ( ( ( ( ( ( ( ( (1(#֤֤֤֤֤֤֤֤֤֤֤֤֤գ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤П ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('';++>,,?--?..@//A00A22C33C44D44D3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (XX]eeeffffffffffffeee00@) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,OOVfffffffffffffffeee77E ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&գ֤֤֤֤֤֤֤֤&% ( ( ( ( ( ( ( ( (1(#֤֤֤֤֤֤֤֤֤֤֤֤֤գ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3--?..@//@00A11B22C33C44D55E66E44D ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@@Lddefffffffffffffffddd44C* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/NNUffffffffffffffffff``a1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (o֤֤֤֤֤֤֤֤֤&% ( ( ( ( ( ( ( ( (1(#֤֤֤֤֤֤֤֤֤֤֤֤֤գդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդc ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++>//@00A11B22C33C55D66E77F88F99G,,= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0[[_fffffffffffffffffffffIIQ2 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,((;[[^ffffffffffffffffffddeIIS ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Řդդդդդդդդդ&% ( ( ( ( ( ( ( ( (1(#դդդդդդդդդդդդդգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (500A11B22C44D55D66E77F88G99H::H;;H. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (66EaacfffffffffffffffffffffddeIIR&&:/) ( ( ( ( ( ( ( ( ( ( ( (+122CWW[ffffffffffffffffffffffffXX\1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (:."գգգգգգգգգգ&% ( ( ( ( ( ( ( ( (1'#գգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգ % ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (00A33C44D55D66E88F99G::H;;I<>K??K$$9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )<>K??K@@LAAM??K+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!6HHR__afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeXX\;;H- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (]Hգգգգգգգգգգգ&% ( ( ( ( ( ( ( ( (1'#գգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգE6! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.77F99G::H<>K??K@@LAAMBBNCCN66E ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5;;HPPW``bfffffffffffffffffffffffffffffffffffffffeee[[^IIR00A. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (գգգգգգգգգգգ&% ( ( ( ( ( ( ( ( (1'#գգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգƗ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (..?::H;;I==J>>K??K@@LBBMCCNDDOEEOFFP))= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-##822C;;I??KDDNHHQGGQCCN>>K88F,,?4 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+#$ҡգգգգգգգգգգգ&% ( ( ( ( ( ( ( ( (1'#գգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգԢ3)# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (::H<>K??KAALBBMCCNDDOEEPFFPGGQGGQ2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (zգգգգգգգգգգգգ&% ( ( ( ( ( ( ( ( (1'#գգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!7==J??K@@LBBMCCNDDOEEPFFPHHQHHRJJSEEO+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (' $Ѡգգգգգգգգգգգգ&% ( ( ( ( ( ( ( ( (1'#գգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգӢ.%# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (;;H@@LAAMCCNDDOEEPFFPHHQIIRJJSKKTLLT< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#$ϞԢԢԢԢԢԢԢԢԢԢԢԢԢ&% ( ( ( ( ( ( ( ( (1'#ԢԢԢԢԢԢԢԢԢԢԢԢԢӡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢҠ*"# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&&:CCNDDOFFPGGQHHRIISKKTLLTMMUOOVPPWPPW##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (kԢԢԢԢԢԢԢԢԢԢԢԢԢԢ&% ( ( ( ( ( ( ( ( (1'#ԢԢԢԢԢԢԢԢԢԢԢԢԢӡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (::HEEPGGQHHQIIRKKSLLTMMUNNVPPWQQXRRYRRX4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%ΝԢԢԢԢԢԢԢԢԢԢԢԢԢԢ&% ( ( ( ( ( ( ( ( (1'#ԢԢԢԢԢԢԢԢԢԢԢԢԢӡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢѠ#$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *FFPGGQHHRJJSKKTMMUNNVPPWQQXRRXSSYUUZSSY0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (dԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢ&% ( ( ( ( ( ( ( ( (1'#ԢԢԢԢԢԢԢԢԢԢԢԢԢӡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0HHQIIRKKSLLTMMUOOVPPWRRXSSYTTZVV[WW\TTY. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢ&% ( ( ( ( ( ( ( ( (1'#ԢԢԢԢԢԢԢԢԢԢԢԢԢӡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢҠB5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())>K11A1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ &$ ( ( ( ( ( ( ( ( (0'"Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ VC ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (..?EEOEEODDODDODDODDOCCNCCNBBNBBMAAM@@L??L??K>>K==J<>K>>K==J<@@L@@L@@L??L??K>>K>>K==J==J<""7+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (jџ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ &$ ( ( ( ( ( ( ( ( (0'"Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ̚ $ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.77F>>K==J==J==J<++>**=))<'';""73, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (dО ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ &$ ( ( ( ( ( ( ( ( (0'"ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ Н >1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (***=99G88G88F77F77F66E55E44D44D33C22C11B00B00A//@--?,,?++>**=))=((<'';&&:%%:$$9##8!!6530, ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (rў ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ &$ ( ( ( ( ( ( ( ( (0'"ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ϝ [F ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,..?66E55E55D44D33C33C22C11B00B00A//@..@--?,,>++>**=))<((<'';&&:%%:$$9##8!!7 76543310/..,+) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (}О џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ *"# ( ( ( ( ( ( ( ( (4)!џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ О v\ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (***=33C22C22B11B00A//A//@..@--?,,?++>**=))=((<'';&&;%%:$$9##9""8!!7 665432210//.-,+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ `J ( ( ( ( ( ( ( ( (eNџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ О m ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )'';00A//A..@..@--?,,?++>++>**=))<((;'';&&:%%:$$9##8""8!!7 655432210//.-,+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (& џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ w ( ( ( ( ( ( ( ( (tџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ О { ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##9--?,,>++>**=**=))<((<'';&&:%%:$$9##9""8!!7 7654432110/..-,+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( $Ș џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ О 0'" ( ( ( ( ( ( (6+!О џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.&&:((;'';&&;&&:$$9$$9##8""8!!7 6654432110//.-,,+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'I9џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ŕ $# ( ( ( ( '%#ŕ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ͜ @2 ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2""8$$9##8""8!!7 66554332110/..-,++* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( &iџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ q;/ %0 fQ'01111111111111111111111110#F7^J(01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111/Ԫ*0v011111111111111111111111111111111Ӧ,k-$ RA$/11111111111111111111110r2' J:$ް/1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110/Rݮ(&/11111111111111111111111111111111٫.j% L<&1111111111111111111111w !=0 '0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110/'/01111111111111111111111111111111/x ,#  ZG)11111111111111111111%(K;ȝ*0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110.^,4001111111111111111111111111111111$<0 oW̡+111111111111111111™);. aLԧ,0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100,#.01111111111111111111111111111111'N= gը-1111111111111111ѥ,O> w^ݮ/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110.j*+/0111111111111111111111111111111ԧ-nW /$ #1111111111111111w^ $011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111/$߲.j00000000000000000000000000000000!.$ cNʠ*00000000000000(!F7٬-/0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/߰/G./000000000000000000000000000000΢*`L y/0000000000000aM { /0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/-r'!./000000000000000000000000000000w$XEĚ)000000000000%4( ڪ-/0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.ܮ#-[0000000000000000000000000000000ǜ*YFs.0000000000/P@p/0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000//<./000000000000000000000000000000|!*!bLʞ*0000000000(7* /0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/-gܮ.//00000000000000000000000000000ޯ/y_4* $0000000000h ȝ)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.۶$.N/000000000000000000000000000000ś)UB r/000000000E7k00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000..2//000000000000000000000000000000"/% iSΣ+00000000ǝ*@1 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.-[/000000000000000000000000000000/g =0 &00000000qҦ,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/-}ܰ#0/00000000000000000000000000000ӧ,hR"00000000cM #0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000//(ݮ*1 }b////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////.................................̠)^J y........S@t.............................................................................................................................................................................................................................................................................................................................................................,-..............................ت+oW$!........mV $...............................................................................................-----........................................................................................................................................................................................................................................................,,-...............................pM<&........ ߯-.............................................................................-ݮ-۬-٪-ש-է-Ӧ-Ѥ-Ϣ-͡-˟-ʞ-ɞ-ȝ-ȝ-ƛ-Ù--,,,,,--ƛ-ȝ-ȝ-ȝ-ɞ-ʞ-˟-͡-Ϣ-Ѥ-Ӧ-է-ש-ګ-ܭ-ޯ--.....................................................................................................................................................................................................................................,,-...............................# %y_ǝ'------------------------$UC oWʟ(,------------------------------٫,+{+u]*I;)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()"(UD)f*+ȝ+ݮ,-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,----------------------------------------$cN3( oҥ)-------------------------,ʟ(jS-#hҥ),-----------------------------΢,+d*TD))!(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((4*(`M)m*+ש,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,-----------------------------------------Ɯ'w]' H8|٪*---------------------------,Ԧ*d," @1 wר*-----------------------------̡,~+kU*8.(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((E8(z`*+֩,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Ҥ(wWE 4) sZ#ޮ+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ګ+|]I"1&nU"۫*,,,,,,,,,,,,,,,,,,,,,,,,,,,,˟+z*eQ)1)(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((?3(s\)*֨+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ę&nO>*!jS զ),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+͠'sTB(eOԦ(+,,,,,,,,,,,,,,,,,,,,,,,,,,߮,ɝ+v)aM(.&(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((;0(oW()֧+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,߯+$iXD0% A3 kS}Т',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,߮+Ś&n3(  >0 gPy͡'+,,,,,,,,,,,,,,,,,,,,,,,,,,߮,ǜ+s)\I(,$( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((8.(iS(~)է+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ݭ+ę&i`K8+  &J:qXs"ѣ(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ޮ+ȝ& jdN=/   %F7 mVq!Ϣ'߯+,,,,,,,,,,,,,,,,,,,,,,,,,,ޮ,Ś+o)WF(*"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5*(cP(z)ԥ+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+ʞ&!wnfv\gP[G`KnU|`jr}$֧),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,߮+ϡ'"xofw\iR^I_JkTy_iq|#ӥ(+,,,,,,,,,,,,,,,,,,,,,,,,,,,ޮ+Ù*k)QA(' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1((]J(v*Ѥ+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+ة*Ρ'ƛ&ɝ'ҥ)ܬ*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+٪*Т(ǜ&ȝ&Ҥ(۫*+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ޮ+*g)L>($( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-%(XG)s*͡+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ޮ+*}c)G9("( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*"(SB)p*ˠ+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ѥ+m)E7(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('!(SB){*ګ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ݮ+*UD(%( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0'(hS)+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+ś*oX(2)(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((A4(h)΢+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++۬+p(?3(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ("(SC()ܭ+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*TD(%( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((1)(mW(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++̡+r[)0((( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((A5(n)ҥ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ܭ+v*?3(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#(VE(*ݮ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*WF($( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((0((r[(Ě*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Ѥ+z`)0'(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((B5(u)֨+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++߰+~*A5(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((!(ZI(*߰+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Ԧ+t\)' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ))** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((8-(t)٪++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*P@(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ***++++,,,,+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!(rZ)ʞ*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++߯+y)6+(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) )**+++,,,---..../-+ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((Q@(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*****************************************************************************************************************************************ԥ*t\)"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***+++,,---...///00000., ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((2)(v)٩*****************************************************************************************************************************************()*************************************************************************************************************************************)P@(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,,---..///00011111222/, ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((t[(˟)**************************************************************************************************************************************(()***********************************************************************************************************************************߮*z)3*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) **+++,,,--...///00111122233334430, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N?()߯*************************************************************************************************************************************(()**********************************************************************************************************************************ӥ*u](( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ))**+++,,---...//0001112223334445555551, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-%(z)٪************************************************************************************************************************************(()********************************************************************************************************************************߮)(RA(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,,--...//00011122233344455566 6 7!!7""8""8""8!!72, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((w](͠(߮)*********************************************************************************************************************************(()*******************************************************************************************************************************۫){(4+( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,,--...//0001112223334455566 6 7!!7!!7""8##8##8##9$$9$$9$$9 70* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N?((ݭ)********************************************************************************************************************************(()*****************************************************************************************************************************ޮ)̠)w_(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,---..///001111223334445556 6 6!!7!!7!!7""8##8##9$$9$$9%%:%%:%%:&&:&&;&&: 6/) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+$(z(ԧ)߯)******************************************************************************************************************************߯(()****************************************************************************************************************************ܭ)(VE(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,---..///001112223334455566 6 7!!7!!7""8##8##8##9$$9%%:%%:%%:&&:&&;'';'';((;((<((<&&:5. ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((w_(ɟ(ޮ)*****************************************************************************************************************************߯(()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))߯)ګ)(@4( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,---..///00111222334445556 6 7!!7!!7""8""8##8##9$$9$$9%%:%%:&&:&&;'';'';((;((<))<))<))=**=**=))<&&92, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (\J((ݭ)߯))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))߯)ܭ)ت)Ԧ)У)Ϣ)ѥ)֨)ګ)ޮ)߯))))))))))))))))))))))))))))))))߯((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))߯)ة(|(8.( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,---..//000111223334445566 6 7!!7!!7""8##8##8$$9$$9$$9%%:&&:&&;'';'';((;((<))<))<))=**=**=**=++>++>++>,,>**=""7. ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N?((ܭ(߯))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ܭ)͡((i(_L(9.(/'(L=(s[(y((ש(߯)))))))))))))))))))))))))))))))߯((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))߯)է(t(0'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***++,,---..//00011122333445556 6 6!!7!!7""8""8##8##9$$9$$9%%:%%:&&:'';'';((;((<))<))<))=**=**=**=++>++>,,>,,?--?--?--?..@,,>$$90* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5((۬(߯)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))߯)ը((QA(( ( ( ( ( ( ( (& (o(ʞ(ݭ)߯)))))))))))))))))))))))))))))߯((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ޯ)ѥ(n((!( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) )**++,,---..//00011122333445556 6 7!!7!!7""8##8##8$$9$$9%%:%%:%%:&&:&&;((;((<((<))<))=**=**=**=++>++>,,>,,?--?--?--?..@..@..@//@//A--@&&:0+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (6,((٫(߯)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))߯)͡(k(-%( ( ( ( ( ( ( ( ( ( ( (YG((ܬ(߯))))))))))))))))))))))))))))߯((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ޮ)̠(f("( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) )**++,,---..//00011122334445566 6 7!!7!!7""8##8##9$$9$$9%%:%%:&&:&&;'';'';((<))<))=**=**=**=++>++>,,>,,?--?--?..@..@..@//@//A//A00A00A00B11B//A'';2+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,$((ש(߯))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))Ӧ(t](( ( ( ( ( ( ( ( ( ( ( ( ( (3*((ޮ))))))))))))))))))))))))))))߯((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ݭ)ǝ(y`(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )**++,,---..//0001112233444556 6 6!!7!!7""8""8##8##9$$9$$9%%:%%:&&:&&;'';((;((<))<))=**=**=++>++>,,>,,?--?--?..@..@..@//@//A//A00A00A00B11B11B22B22C22C11B))<2, ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#(z(ԧ(߮))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))۫)w(0(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (bN(ϣ(߮)))))))))))))))))))))))))))߯((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ܬ)—(nW(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) )*++,,,--..//0001122233444556 6 7!!7!!7""8##8##8$$9$$9%%:%%:&&:&&;'';'';((<((<))<**=**=++>++>,,>,,?--?--?..@..@..@//@//A00A00A00B11B11B22B22C22C33C33C33C33C44D33C++=3- ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((q(Ҥ(߮)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(M>( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((w(ܬ())))))))))))))))))))))))))߯((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))۫)(eP(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (***++,,--..//01112233444556 6 7!!7!!7""8##8##9$$9$$9%%:%%:&&:&&;'';((;((<))<))<**=**=++>++>,,?--?--?--?..@..@//@//A00A00A00B11B11B22B22C22C33C33C33C44D44D44D55D55E55E55D-->5- ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((h(Ρ()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ܬ)}c(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0'(Ҥ(߮))))))))))))))))))))))))))߯((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))ڪ)(ZH( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) )*+,-.//0123445556 6 7!!7!!7""8##8##9$$9$$9%%:%%:&&:'';'';((<((<))<))=**=**=++>,,>,,?--?--?..@..@//@//A00A00A00B11B11B22C22C33C33C33C44D44D44D55D55E55E55E66E66E77F77F77F//@ 6- ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((v^(ʞ)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))̟)_K( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((߮))))))))))))))))))))))))))߯((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))٪)(QA( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,./022346 7!!7!!7""8##8##9$$9%%:%%:&&:&&:'';((;((<))<))<))=**=**=++>,,?--?--?..@..@//@//A//A00A00B11B11B22C22C33C33C33C44D44D44D55D55E55E66E66E77F77F77F88F88F88G88G77F,,>2+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (jT(Ù))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(J;( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (u(ݬ))))))))))))))))))))))))))߯((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((߮(ר((F8( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*+-/134 6""8$$9$$9%%:%%:&&:&&;'';((;((<))<))=**=**=++>++>,,>--?--?..@..@//A//A00A00B11B11B22B22C33C33C33C44D44D55D55E55E66E66E77F77F77F88F88G88G88G99G99G99G99H::H66E&&:0 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (\I((߮(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((4*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (mV(۫((((((((((((((((((((((((((߯(''((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((߮(֧(z(;0( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ),/25 6##8%%:&&;'';((;((<))<))=**=**=++>++>,,?--?..@..@//@//A00A00A00B11B22B22C33C33C33C44D44D55D55E55E66E66E77F77F77F88F88G88G99G99G99H::H::H::H::H::H;;I;;I22B 6- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N>((߮(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((q(#( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (L=(٪((((((((((((((((((((((((((߯&''((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ר(x(2)( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*-13 6##8&&:((<))=**=**=++>++>,,?--?--?..@//A//A00A00B11B22B22C22C33C33C44D44D55D55E55E66E77F77F77F88F88G88G99G99G99H::H::H::H::H;;I;;I;;I<,,?--?..@..@//A00A00A11B11B22B22C33C33C44D44D55D55E55E66E77F77F77F88F88G88G99G99G99H::H::H::H;;I;;I<>K88F((;1 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (G9(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((n(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(٩((((((((((((((((((((((((((߯&''((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((۫((<1( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,03""7((;--?..@//@00A00B11B22B22C33C33C33C44D44D55E55E66E66E77F77F88F88G99G99G99H::H::H::H;;I;;I<>K>>K>>K>>K>>K??K??K??K44C!!8- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((RB((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((n(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(٩((((((((((((((((((((((((((߯&''(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ݬ((F8( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+05%%9,,=00B11B22B22C33C33C44D44D55D55E66E66E77F77F88F88G99G99G99H::H::H::H;;I<>K>>K>>K>>K??K??K??K??L??L@@L@@L@@L>>K..@4* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((^K(ę((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((n(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(٩((((((((((((((((((((((((((߯&''((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ݭ((O?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,2""8))=00A33C33C44D44D55E55E66E77F77F88F88G88G99G99H::H::H;;I;;I<>K>>K>>K??K??K??K??L@@L@@L@@LAALAALAAMAAMAAMAAMAAM;;H))<1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((iR(ɝ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((n(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(٩((((((((((((((((((((((((((߯&''߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(ݮ(—(ZF( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*/4%%:-->44C55E66E66E77F77F88G88G99G99H::H::H::H;;I<>K>>K>>K??K??K??K??L@@L@@LAALAALAAMAAMAAMBBMBBMBBMBBMBBNBBNBBNBBM66E""7* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((t[(Ρ(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(n(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(ة(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯&ޮ'߯'߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(ޮ(ɝ(bM( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+0 6));11A77F88F88G99G99G99H::H::H;;I<>K>>K>>K??K??K??L@@L@@LAALAAMAAMAAMBBMBBMBBMBBNCCNCCNCCNCCNCCNCCNCCNCCNCCN??J**=/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((|b(Ҥ(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(n(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(ة(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯&ޮ'߯'߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(ޮ(ϣ(kU(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,2##9..?77E99H::H::H;;I;;I<>K>>K>>K??K??K@@L@@LAALAAMAAMAAMBBMBBMBBNCCNCCNCCNCCNCCNDDODDODDODDODDOEEOEEOEEODDOCCN22C4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%(i(ը(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(n(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(ة(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯(߯&ޮ'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'֨'t\(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *0""7..@88F;;I<>K>>K>>K??K??L@@L@@LAALAAMAAMBBMBBMBBNCCNCCNCCNCCNDDODDODDOEEOEEOEEOEEPEEPEEPFFPFFPFFPFFPFFPEEO;;H$$9+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+#(p'٪'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'n'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(ة'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯&ޮ&߯&߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'۫'~d'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )/##8//@::G==J==J>>K>>K??K??K@@L@@LAALAAMAAMBBMBBNCCNCCNCCNDDODDODDOEEOEEOEEPEEPFFPFFPFFPFFPFFPFFPGGQGGQGGQGGQGGQGGQFFPAAL--?/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2)'w'ܬ'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'n'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(ة'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯&ޮ&߯&߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'ݭ'k'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )/""700A;;I??K??K@@L@@LAALAAMBBMBBMBBNCCNCCNCCNDDODDOEEOEEOEEPFFPFFPFFPFFPGGQGGQGGQGGQGGQGGQGGQHHQHHQHHQHHQHHQHHQGGQEEO44D5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((:/'}'ݭ'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'n'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B6(ة'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯'߯&ޮ&߯&߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'t'&' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )/""7//A<>JBBNCCNCCNCCNDDODDOEEOEEPFFPFFPFFPGGQGGQGGQHHQHHQHHRHHRHHRIIRIIRIIRIIRJJSJJSJJSJJSJJSJJSJJSJJSJJSJJSIIRCCM00A0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((L<''߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'m'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5(ب'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߭&ޭ&߮&߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮''5+' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ).!!600A>>KDDODDOEEOEEPFFPFFPGGQGGQGGQHHQHHQHHRHHRIIRIIRIIRJJSJJSJJSJJSJJSKKSKKSKKSKKSKKSKKSKKSKKSKKSKKSJJSJJSGGQ77F 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((TD''߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'m'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5(ب'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߭&ޭ&߮&߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮''?3' ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )-!!655DCCNFFPFFPGGQGGQGGQHHQHHRHHRIIRIIRIISJJSJJSJJSKKSKKSKKTKKTKKTKKTLLTLLTLLTLLTLLTLLTLLTLLTKKTKKTKKTKKTIIR@@K))<, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('cO'Ȝ'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'m'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5(ب'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߭&ޭ&߮&߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'ӥ'YG'' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )0((<==JFFPGGQHHQHHRHHRIIRIISJJSJJSJJSKKSKKTKKTLLTLLTLLTLLTLLTLLTLLTMMUMMUMMUMMUMMUMMUMMULLTLLTLLTLLTLLTKKSEEO11A/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!'}b'ק'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'m'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5(ب'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߭&ޭ&߮&߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'ݭ'z`'' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+311BCCNHHRIIRIISJJSJJSKKSKKTKKTLLTLLTLLTLLTMMUMMUMMUMMUMMUMMUNNUNNUNNUNNUNNUNNUMMUMMUMMUMMUMMUMMULLTLLTHHQ55E1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2)'w'ݭ'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'m'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5(ب'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߭&ޭ&߮&߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'|')"' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,""8::HHHQJJSKKSKKTLLTLLTLLTMMUMMUMMUMMUNNUNNUNNVNNVOOVOOVOOVOOVOOVOOVOOVOOVOOVOOVNNVNNVNNUNNUMMUMMUMMUIIR88F2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((J;''߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'m'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5(ب'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߮'߭&ޭ&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&&<1& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )/++>CCNKKTLLTLLTMMUMMUMMUNNUNNVNNVOOVOOVOOVOOVPPWPPWPPWPPWPPWPPWPPWPPWPPWPPWOOVOOVOOVOOVOOVNNVNNUMMUJJS;;I5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('cO&ȝ&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ب&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߭&ޭ$߮%߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&ԥ&XG&' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+466EIIRMMUNNUNNVNNVOOVOOVOOVPPWPPWPPWPPWPPWQQWQQWQQWQQXQQXQQWQQWQQWPPWPPWPPWPPWPPWPPWOOVOOVOOVNNVKKT>>K!!7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!'e&ר&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ب&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߭$ޭ$߮%߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&ޭ&y_&' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-$$:AALMMTOOVOOVPPWPPWPPWQQWQQWQQXQQXQQXRRXRRXRRXRRXRRXRRXRRXRRXQQXQQXQQXQQXQQWPPWPPWPPWPPWOOVOOVMMTAAM%%: ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3)'y&ޭ&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ب&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߭$ޭ$߮%߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&|&+#& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *000@JJRPPWQQWQQXQQXQQXRRXRRXRRXRRYRRYSSYSSYSSYSSYSSYSSYRRYRRYRRYRRXRRXRRXQQXQQXQQWPPWPPWPPWOOVNNUDDO'';* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('K<&&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ب&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߭$ޭ$߮%߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&&=2& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*5BBMPPWRRXRRXRRYSSYSSYSSYSSYTTYTTZTTZTTZTTZTTZTTZTTYTTYSSYSSYSSYRRYRRXRRXRRXQQXQQWPPWPPWPPWOOVFFP**=+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('fQ&ɝ&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ب&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߭$ޭ$߮%߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&ӥ&XF&' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/88FOOVSSYSSYTTYTTZTTZTTZUUZUUZUUZUUZUUZUUZUUZUUZUUZTTZTTZTTZTTYSSYSSYRRYRRXRRXQQXQQWPPWPPWOOVHHR..?, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('f&ר&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ب&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߭$ޭ$߮%߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&ޭ&z`&' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+**=NNVTTZUUZUUZUU[UU[VV[VV[VV[VV[VV[VV[VV[VV[UU[UU[UUZUUZUUZTTZTTZSSYSSYRRYRRXRRXQQXQQWPPWOOVJJS11B. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2)'{&ޭ&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ب&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߮&߭$ޭ$߮%ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&|&.&& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )4FFPTTZVV[VV[VV[VV[WW\WW\WW\WW\WW\WW\WW\VV[VV[VV[VV[UU[UUZUUZTTZTTZSSYSSYRRYRRXQQXQQXPPWOOVKKS44D/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'M>&&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&m&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ר&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&߭$ݭ$ޮ%ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&ޮ&&@4& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-<>KZZ][[^[[^[[^[[^[[^[[^ZZ^ZZ^ZZ]YY]YY]XX]XX]WW\WW\VV[VV[UU[UUZTTZSSYSSYRRYRRXQQXPPWPPWNNU00A, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'UD%%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ק%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݭ$ݭ$ޭ$ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%Ӥ%VD&( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,,>ZZ^]]`]]`]]`]]`\\_\\_\\_[[_[[^[[^ZZ^ZZ]YY]XX]XX\WW\WW\VV[UU[UUZTTZSSYSSYRRXQQXQQWPPWNNU--?+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((i&ר%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ק%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݭ$ݭ$ޭ$ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݬ%j&%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2UU[]]`^^`]]`]]`]]`]]`\\_\\_[[_[[^ZZ^ZZ]YY]XX]XX\WW\VV[VV[UU[UUZTTZSSYRRYRRXQQXPPWPPWLLT((;* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (:/'%ݬ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ק%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݭ$ݭ$ޭ$ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݬ%%B5' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0PPW^^`__a^^a^^`]]`]]`\\_\\_[[_[[^ZZ^ZZ]YY]XX]XX\WW\VV[VV[UUZTTZSSYSSYRRXQQXQQWPPWOOVJJR%%9 * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (mV&ʝ%ݬ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ק%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݭ$ݭ$ޭ$ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%٨%mV&' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.LLU^^a__a__a^^a^^`]]`]]`\\_[[_[[^ZZ^ZZ]YY]XX]WW\WW\VV[UU[UUZTTZSSYRRYRRXQQXPPWPPWOOVGGQ!!7 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'y%۪%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ק%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݭ$ݭ$ޭ$ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ܫ%|%3*' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,FFP]]```b__a__a^^`]]`]]`\\_[[_[[^ZZ^YY]XX]XX\WW\VV[VV[UUZTTZSSYSSYRRXQQXPPWPPWOOVNNVDDN4 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Q@&%ݬ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ק%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݭ$ݭ$ޭ$ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ʝ%VE& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,AAL]]```b__a__a^^`]]`\\_\\_[[^ZZ^ZZ]YY]XX]WW\WW\VV[UU[UUZTTZSSYRRXQQXQQWPPWOOVNNVNNU@@L2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((h%Ӥ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5'ק%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ޭ%ݭ$ݭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$ޭ$٩$h&$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+<PPWYY]XX]WW\WW\VV[UU[UUZTTZSSYRRYRRXQQXPPWPPWNNVNNUMMULLTLLTKKTJJSIISIIRHHRFFP''; ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (C6&$۫$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ"ݭ#ݭ#ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$˜$]I& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,..@PPWXX\WW\VV[VV[UUZTTZSSYSSYRRXQQXQQWPPWOOVNNVNNUMMULLTKKTKKSJJSIIRHHRHHQGGQAAM5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (h%Ҥ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$m%' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ$ݭ"ݭ#ݭ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#٩#t$)"& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-22CPPWVV[VV[UUZUUZTTZSSYRRYRRXQQXPPWPPWOOVNNVMMUMMULLTKKTKKSIISIIRHHRGGQGGQFFP::H/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9.&$۫#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#l$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݭ"ݫ!ݬ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ę#aL% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.66DPPWUU[UUZTTZSSYRRYRRXQQXQQWPPWOOVNNVNNUMMULLTLLTKKTJJSIISIIRHHQGGQGGQFFPEEO00A* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (l$ԥ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#l$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݫ!ݬ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ک#v$,#& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/88FPPWTTZSSYSSYRRXQQXQQWPPWOOVOOVNNVMMUMMULLTKKTKKSJJSIIRHHRHHQGGQFFPFFPEEOCCN&&: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>JOOVPPWPPWOOVNNVNNUMMUMMULLTKKTKKSJJSIIRHHRHHQGGQGGQFFPEEPDDODDOCCNBBNBBM//?* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((s#֧#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#l$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݫ!ݬ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#۪#~$1(& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )6AALPPWOOVNNVNNUMMUMMULLTKKTKKSJJSIISIIRHHRGGQGGQFFPEEPDDODDOCCNCCNBBMAAM??K%%9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (B5&Ǜ#ܫ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#l$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݫ!ݬ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ʝ#nW$( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*&&:EEONNVNNUMMUMMULLTKKTKKTJJSIISIIRHHRHHQGGQFFPFFPEEODDOCCNCCNBBMAAMAAL??K::H2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((v#ب#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#l$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݫ!ݬ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#۪#$2)& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,..@HHQMMUMMULLTKKTKKTJJSIISIIRHHRHHQGGQFFPFFPEEPDDODDOCCNBBNBBMAAM@@L??K>>J22B* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (D7&˞#ܫ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#l$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5'֧#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݫ"ݫ!ݬ"ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#ݬ#˞#sZ%( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (066EKKSLLTKKTKKTJJSIISIIRHHRHHQGGQGGQFFPEEPDDODDOCCNCCNBBMAAMAAL@@L>>K>>K<>K==J<>K==J<>K==J<>K>>K==J<11A44C66E99G<>K;;H88F66E33C//A,,>))<##81+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (399GFFPFFPFFPEEPDDODDOCCNCCNBBNBBMAAMAAL@@L??K>>K>>K==J<>JFFPEEPDDODDOCCNCCNBBNBBMAAMAAL@@L??K??K>>K==J==J<>K==J==J<>K>>K==J==J<>K>>K==J==J<, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s$ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"k$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ݫ ܪ ܫ!ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"ܫ"#6+& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+""7;;INNVYY]aaceeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdde__aWW[KKS44D2 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )%%:<>K>>K==J==J<>K>>K==J==J<>K>>K==J==J<>K==J==J<77FCCNQQW__affffffffffffffffffffffffffffffffffffffffffffffffffffffddd]]_PPV--? ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.33C==J==J<$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+**=PPW``addeffffffffffffffffffffffffffffffffffffffffffffffff__`MMU88G##80-,* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*,-2))<==JRRXaabffffffffffffffffffffffffffffffffffffffffffffffffdde^^`KKS5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!777F<1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'fQ#ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!۫ ܪ ܫ ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ک!"' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3EEO^^accdffffffffffffffffffffffffffffffffffffffffffeeeUUZ<CCN[[^eeeffffffffffffffffffffffffffffffffffffffffffccd]]`<IIR__affffffffffffffffffffffffffffffffffffffffffbbcVVZ**< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (133C::H99G99G88G88F77F77F66E55E44D44D33C33C22C22B11B00B00A//A//@..@))</ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('w"ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!۫ ܪ ܫ ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!!;/% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )""7PPWaaceeeffffffffffffffffffffffffffffffffffffaabJJS++>/* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*233CSSYccdffffffffffffffffffffffffffffffffffffddd``bIIR0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&&:66E88G88G77F77F66E66E55E55D44D33C33C22C22B11B00B00A//A//@..@--?++> 7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'Q@$ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!۫ ܪ ܫ ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ب!" ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+44C__`ddeffffffffffffffffffffffffffffffffffff``bEEO 6* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+((&&:. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&ț!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!۫ ܪ ܫ ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!˞!gR# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-FFOccdeeefffffffffffffffffffffffffffffffff^^`BBM4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )%%:MMUcccffffffffffffffffffffffffffffffeeeddd__a;;H ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (433C66E66E55E55D44D44D33C22C22B11B00B00A//A//A..@..@--?--?,,?++>**=5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('h"ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!ܫ!۫ ܪ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ !(!& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5XX\eeefffffffffffffffffffffffffffffffff^^`??K2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 7KKSccdffffffffffffffffffffffffffffffeeecccMMU/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())<44D55E44D44D44D33C33C22B11B00B00A//A//@..@..@--?--?,,>++>++>**=$$8. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '<1%ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ ܪܫܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ զ u# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )11BbbdffffffffffffffffffffffffffffffeeebbcKKS6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((++>++>**=))=))<((;5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('!ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ܪܫܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۪ ɜ TC$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*AALffffffffffffffffffffffffffffffeeedddWW[//@* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+<++>**=**=))=))<((<((<""8- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('oW#۪ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ܪܫܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۪ !' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,HHRfffffffffffffffffffffffffffeeeddd]]_??K0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3MMUbbcdddfffffffffffffffffffffffffff__a::H* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-..?11B11B00B00A//A..@..@--?--?--?,,>++>++>**=**=))=))<((<((;'';&&:3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '/%&ק ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ܪܫܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ե q" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.MMUfffffffffffffffffffffffffffeeecccPPV$$8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (..?]]_eeefffffffffffffffffffffffffff``b>>K, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##9//A00A//A//A//@..@--?--?,,?,,>++>++>**=**=))<))<((<((;'';&&;&&: 6, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('!ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A5&զ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ܫ ۫ܪܫܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ Ο bN$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0SSZfffffffffffffffffffffffffffeee__aDDN/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1SSYccdfffffffffffffffffffffffffffaacCCO. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.,,?//A//@..@..@--?--?,,>++>++>**=**=))=))<((<((<'';'';&&:&&:%%:##92 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('~c#ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4&ե ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ۫ܩܪܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ۩ ƙ 4*& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3WW\ffffffffffffffffffffffffeeedddYY\44D * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+AAM``aeeeffffffffffffffffffffffffbbcGGQ0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##8--?..@..@--?,,?,,>++>++>**=**=))=))<((<((;'';&&;&&:%%:%%:$$9$$94+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('O>%۩ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4&ե ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ܪ ۩ܩܪ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ٩ !( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3YY]eeefffffffffffffffffffffeeebbcQQW%%9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (//@ZZ^ddeffffffffffffffffffffffffccdHHQ0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-++=--?--?,,?++>++>**=**=))=))<((<((<((;'';&&;&&:%%:%%:$$9$$9##9!!70 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (( 'Т ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4&ԥ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۩ک۪۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ԥ l" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1TTYeeefffffffffffffffffffffeeeaabHHQ0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4SSYdddffffffffffffffffffffffffaabCCN. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""8++>,,>++>**=**=))=))<))<((<((;'';'';&&:&&:%%:%%:$$9$$9##8##8""83* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('!۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ k#' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4&ԥ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۪ ۩ک۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪Π[G$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0OOUddefffffffffffffffffffffeee__`DDN, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1OOUbbcffffffffffffffffffffffff``a??K- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-))=++>**=**=))=))<((<((<'';'';&&;&&:%%:%%:$$9$$9##9##8""8""8!!74- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('w]#۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪k"' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ԥ۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۩ک۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪کǚ,%& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/JJRdddfffffffffffffffffffffeee]]_>>J* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/IIRaabffffffffffffffffffffffff^^`::G, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!7))<**=))<((<((<((;'';&&;&&:&&:%%:%%:$$9$$9##8##8""8!!7!!7 7 60 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('I:%٨۪۪۪۪۪۪۪۪۪۪۪۪۪۪k"' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ԥ۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۩ک۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪٨ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-CCNccdfffffffffffffffffffffeee\\^99G ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.DDN``affffffffffffffffffffffff[[^55D, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.((;))<((<((;'';'';&&:&&:%%:%%:$$9$$9##9##8""8""8!!7!!7 7 662+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (' &ɜ۪۪۪۪۪۪۪۪۪۪۪۪۪۪k"' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ԥ۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۩ک۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪ԥg" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+<ZZ]fffffffffffffffffffffXX\++= ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (154443332222111000///- ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '@3%֦۪۪۪۪۪۪۪۪۪۪۪k!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ԥ۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۩ک۪۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩ڨ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%%:UU[eeeffffffffffffffffff``b++> ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.;;HbbcffffffffffffffffffddeGGQ3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,4433322221111000///.-* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/&&×۩۩۩۩۩۩۩۩۩۩۩j!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ԥ۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩ک۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩٧o! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-EEObbcfffffffffffffffffffffDDN+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4NNUfffffffffffffffffffff__a33C+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (23322221111000///...-* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (' & ۩۩۩۩۩۩۩۩۩۩۩j!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ԥ۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩ک۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩اkS# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,,=YY\fffffffffffffffffffffYY]5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )2%%>00H..F!!;0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*00A]]`fffffffffffffffffffffMMU5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.22221111000///...---+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&i!۩۩۩۩۩۩۩۩۩۩۩j!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ԥ۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩ک۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩ئF7% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-EEObbcffffffffffffffffffccd44D* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())BRRgggyvvrrbbuGG]!!; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0CCNdddffffffffffffffffff``a22C+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*221111000////...---,+ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('jS#۩۩۩۩۩۩۩۩۩۩۩j!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ԥ۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩ک۩کککککککککککککککککککککککککککککککککککککککککککککککککککککککککե"' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**=WW\fffffffffffffffffffffMMU0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+11I]]p}}QQe''@ * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )'';UUZfffffffffffffffffffffLLT4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/111000////...---,,,+ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('M=$٨ککککککککککj!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک۩٩ککککککککککککککککککککککککککککککککککککککککککککککککککککککککککŘ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,CCNbbcffffffffffffffffffaab''< ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++DeewUUi : ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-::Hbbcffffffffffffffffff__a00A* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,1000////...---,,,+++ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9-%͞ککککککککککj!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩کککککککککککککککککککککککککککککککککککککککککککککککککککککککککک~ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((#ککککککککککj!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩کککککککککککککککککککککککککککککککککککککککککککککککککککککککککҢ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++>XX\ffffffffffffffffffddd--?* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (::Q%%? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-@@LeeeffffffffffffffffffOOV4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+,,,,+++*** * ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '?3$ԣکککککککککj!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩ککککککککککککککککککککککککککککککککککککککککککککککککککککککککک ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*==KbbcffffffffffffffffffTTZ3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )NNc22I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (--?ZZ^ffffffffffffffffff``b))= ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *,++++*** * ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (7,%×کککککککککj!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩ککککککککککککککککککککککککککککککککککککککککککککککککککککککککک| ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4MMUeefffffffffffffffffff<>K. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+++** * ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0'%کککککککککj!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩کککککککککککککککککککککککککککککککککککککککککککککککککککککککککh! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (00A\\_ffffffffffffffffffaac%%9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (HH]++D ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*::HccdffffffffffffffffffVVZ5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*** * ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()"&yکککککککککj!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩کککککککککککککککککککککککککککککککککککککککککککککککککککککککککjS" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,AALddeffffffffffffffffffNNV2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44L : ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) * ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ("&j کککککککککj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩کککککککککککککککککککککککککککککککککککککککککککککککککککککککککO?# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4MMUfffffffffffffffffffff66E, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($$=hhy2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0GGQfffffffffffffffffffff==J. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&t[!کککککککککj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%Ӥککککککککککککککککککککککککک٩٩کڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ4+% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++=XX\ffffffffffffffffff]]`""7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3QQe- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (77E``bffffffffffffffffffOOV2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('`L"ڨڨڨڨڨڨڨڨڨj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ӣڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ٩٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (77FbbcffffffffffffffffffKKT2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )ggy88O ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((#ڨڨڨڨڨڨڨڨڨj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ӣڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ٧٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ֥ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-CCMeeeffffffffffffffffff::H- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (88O9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2KKSffffffffffffffffffeee//@* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'B5$ץڨڨڨڨڨڨڨڨj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ӣڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ٧٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨȚ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5NNUffffffffffffffffffeee**= ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,vv??W ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*@@Leeeffffffffffffffffff@@L. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=1$͞ڨڨڨڨڨڨڨڨj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ӣڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ٧٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,,>YY]ffffffffffffffffffYY] 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@@W ; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44C^^`ffffffffffffffffffRRX2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9.%ڨڨڨڨڨڨڨڨj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ӣڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ٧٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (88FdddffffffffffffffffffIIR1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0~~FF]+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&&:TTYffffffffffffffffffccc 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4*%ڨڨڨڨڨڨڨڨj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ӣڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ٧٧ڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨu ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,??Keeeffffffffffffffffff88G, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (HH^""< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1JJSffffffffffffffffffeee++=* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0'%ڨڨڨڨڨڨڨڨj ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A4%ӣڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨ٧٧ڨ٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨i ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0FFPffffffffffffffffffeef**< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4MMc, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )AAMeefffffffffffffffffff55D, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+$%z٨٨٨٨٨٨٨٨j ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@4%ң٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٧٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨v\ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (6NNUffffffffffffffffff]]`##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<>T * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,EEOeeeffffffffffffffffff//@* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('hQ"٨٨٨٨٨٨٨٨j ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@4$ң٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٧٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨8-$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0FFPffffffffffffffffffccd((; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**Css/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (??Kdddffffffffffffffffff55D+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('eO"٨٨٨٨٨٨٨٨j ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@4$ң٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٧٧٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨2)% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2HHQffffffffffffffffff__a&&: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44L2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<>U4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (99G``bffffffffffffffffff<#٧٧٧٧٧٧٧٧i& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ң٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٦٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&&:UUZffffffffffffffffffNNV4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )ggz((B ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,,?XX]ffffffffffffffffffLLT/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'M<#٧٧٧٧٧٧٧٧i& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ң٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٦٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($$9SSYffffffffffffffffffQQW5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (``s""< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (..?ZZ]ffffffffffffffffffJJS/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'O?#٧٧٧٧٧٧٧٧i& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ң٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٦٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""7QQWffffffffffffffffffTTY 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (WWk : ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (11B[[^ffffffffffffffffffFFP. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('RA#٧٧٧٧٧٧٧٧i& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ң٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٦٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧$% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 6OOVffffffffffffffffffWW[!!7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (NNc8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44C]]`ffffffffffffffffffCCM. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('VD"٧٧٧٧٧٧٧٧i& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ң٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٦٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧*"% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5MMTffffffffffffffffffYY]##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (EE[6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (66E^^affffffffffffffffff??K- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('ZF"٧٧٧٧٧٧٧٧i& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ң٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٦٧ااااااااااااااااااااااااااااااااااااااااااااااااااااااا/&$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3JJSffffffffffffffffff]]`$$9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<1# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-@@Lfffffffffffffffffffff22B* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/rr::R * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-GGQfffffffffffffffffffff--?* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&hR ااااااااi& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѢاااااااااااااااااااااااااקئااااااااااااااااااااااااااااااااااااااااااااااااااااااااB5# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )::Heeeffffffffffffffffff::H- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (OOc : ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2LLTffffffffffffffffffeee##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&kT ااااااااi& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѢاااااااااااااااااااااااااקئااااااااااااااااااااااااااااااااااااااااااااااااااااااااK;" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (22CaabffffffffffffffffffDDN0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (00H}}2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""7QQXffffffffffffffffff^^`4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&rY ااااااااi& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѢاااااااااااااااااااااااااקئااااااااااااااااااااااااااااااااااااااااااااااااااااااااZF! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++>ZZ^ffffffffffffffffffLLT3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1zzCCZ+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**=WW[ffffffffffffffffffSSY2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&|aااااااااi& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѢاااااااااااااااااااااااااקئااااااااااااااااااااااااااااااااااااااااااااااااااااااااiS ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%%9SSYffffffffffffffffffVVZ 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (UUi%%> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (22B\\_ffffffffffffffffffIIR0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#&jااااااااi& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ѣاااااااااااااااااااااااااקئااااااااااااااااااااااااااااااااااااااااااااااااااااااااz^ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4LLTffffffffffffffffff__a$$9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44L4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (::Hbbcffffffffffffffffff>>J- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((!%rااااااااi& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$Ѣاااااااااااااااااااااااااקئائئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئk ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0EEPffffffffffffffffffddd,,> ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1wwEE[+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*BBMeeeffffffffffffffffff33C+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,$%{ئئئئئئئئh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѡئئئئئئئئئئئئئئئئئئئئئئئئئקإئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئw ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+>>Kfffffffffffffffffffff;;I- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (;;R8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3LLTfffffffffffffffffffff))< ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1'$ئئئئئئئئh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѡئئئئئئئئئئئئئئئئئئئئئئئئئץإئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (55DaabffffffffffffffffffLLT2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0qqBBX+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())1#͞ئئئئئئئئh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѡئئئئئئئئئئئئئئئئئئئئئئئئئץإئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئգ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,@@Leefffffffffffffffffff>>K. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**Ctt4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5MMUffffffffffffffffffeef++> ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'D6"գئئئئئئئئh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѡئئئئئئئئئئئئئئئئئئئئئئئئئץإئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئ & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44D__affffffffffffffffffPPV2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+OOd..G ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++=XX\ffffffffffffffffff[[_ 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('Q@"ئئئئئئئئئh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѡئئئئئئئئئئئئئئئئئئئئئئئئئץإئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئ:/$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((>JdddffffffffffffffffffSSX3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##=ii{2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,,>ZZ]ffffffffffffffffffccc((< ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($&kئئئئئئئئئh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѡئئئئئئئئئئئئئئئئئئئئئئئئئץإئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئئk ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) *** ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,,>XX]ffffffffffffffffffccc))< ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )00I: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+==JdddffffffffffffffffffPPW3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*#%zئئئئئئئئئh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3$ѡئئئئئئئئئئئئئئئئئئئئئئئئئץإئצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצ~ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) )****+* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1KKSfffffffffffffffffffff@@L. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *;;S''A ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (6MMUfffffffffffffffffffff99G- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1'$צצצצצצצצצh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Сצצצצצצצצצצצצצצצצצצצצצצצצצץ֥צצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ***+++++ ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )::HaacffffffffffffffffffZZ]3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+..Fvv!!; ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (00A^^`ffffffffffffffffff^^a%%: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (7-$Ęצצצצצצצצצh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Сצצצצצצצצצצצצצצצצצצצצצצצצצץ֥צצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצӣ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) )***++++,,,+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('';UUZffffffffffffffffffdde11B+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )9__r2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/CCNeeeffffffffffffffffffIIS2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#ԣצצצצצצצצצh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Сצצצצצצצצצצצצצצצצצצצצצצצצצץ֥צצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצ֥%& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) )***+++,,,,--, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.GGQfffffffffffffffffffffSSX1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1hhzII_- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (**=ZZ]fffffffffffffffffffff33C+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('R@"֥צצצצצצצצצh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Сצצצצצצצצצצצצצצצצצצצצצצצצצץ֥צצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצ>3# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) )***++++,,,----- ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (66E^^affffffffffffffffffddd//A+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-KK`66M+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/AALeeeffffffffffffffffffYY]##8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&eP צצצצצצצצצצh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Сצצצצצצצצצצצצצצצצצצצצצצצצצץ֥צצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצ`J! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) )***++++,,----...-+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!!6QQWfffffffffffffffffffffRRY0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *6nn~RRf2 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())=YY]fffffffffffffffffffffBBN0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&bצצצצצצצצצצh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Сצצצצצצצצצצצצצצצצצצצצצצצצצץ֥צצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצצg ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ***++++,,,---..../., ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>>Jbbcffffffffffffffffffeee..?* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( * :aat5 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.@@Leeeffffffffffffffffff__a)); ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (' %xצצצצצצצצצצh& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Сצצצצצצצצצצצצצצצצצצצצצצצצצץ֥צץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*++++,,,---.../////- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##8SSYfffffffffffffffffffffRRX/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((Att8 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((;XX\fffffffffffffffffffffEEO1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/&$ץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץ̝ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*+,,,---....//0000110+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@@Kbbcfffffffffffffffffffff--?* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (6]]pII_1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.??Kfffffffffffffffffffff``a**= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '9-#ѡץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץӢ)!$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*+,---....//000011111/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($$9TTYeeeffffffffffffffffffYY]0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.OOd>>U, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,,>]]`ffffffffffffffffffeeeFFP2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('Q@ ץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץԣM>J+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (744MMMbffw~~xx``rGG]..G3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3KKSfffffffffffffffffffff``b--? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&nVץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץգqW ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,-...///0001111222232. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&&:UUZeeeffffffffffffffffffbbd!!8 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+55EccdffffffffffffffffffeeeHHQ3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!%kץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץդs ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+-.///0000111222333341 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )AALbbcfffffffffffffffffffffPPV- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($$8VV[fffffffffffffffffffff^^`--> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()!%ץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץ֤ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+.///00011122233334442+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4QQWeeefffffffffffffffffffff22B ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/BBMfffffffffffffffffffffdddAAL/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '1(#ėץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץ֤Ξ& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*./0001111223333444554/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (66D]]_eeeffffffffffffffffff]]_4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*//@``affffffffffffffffffeeeUUZ%%9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'D6"֤ץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץѠL<" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-/01111222333444555563 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-IIRccdfffffffffffffffffffffPPV. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )%%9VVZfffffffffffffffffffffaab66E+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&lTץץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץӢ~b ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+011122233344455556 6 65- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((>J+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3IIRfffffffffffffffffffffeeeJJS4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!%tץץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץդ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*/112223334455566 6 6 7!!7 61 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )@@Laabfffffffffffffffffffffdde,,? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.;;Iddefffffffffffffffffffff[[_..@ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '-$$ץץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץץ֤˛#% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.1223334455566 6 6 7!!7!!7""8""85+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3OOVdddfffffffffffffffffffff]]`4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+//@__afffffffffffffffffffffaac??K/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('F7"֤ץץץץץץץץץץץץg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Рץץץץץץץץץץץץץץץץץץץץץץץץץץ֥ץ֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥ΟSA ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,23334445556 6 6 7!!7!!7""8""8##8##8 7/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (++>XX\eeefffffffffffffffffffffQQX0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*'';VV[fffffffffffffffffffffdddLLT 6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&pX֥֥֥֥֥֥֥֥֥֥֥֥֥g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Ϡ֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥ץե֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥ѡg ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )133444556 6 6 7!!7!!7""8""8##8##8##9$$9##83 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (99G^^`eeefffffffffffffffffffffJJR/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )##8RRWfffffffffffffffffffffeeeUUZ**< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( %y֥֥֥֥֥֥֥֥֥֥֥֥֥g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Ϡ֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥եե֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥ԣ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/3445556 6 7!!7!!7""8""8##8##8##9$$9$$9%%:%%: 6, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,EEPbbcfffffffffffffffffffffeeeCCO. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )6LLUffffffffffffffffffffffff\\_55D+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ',$$Ö֥֥֥֥֥֥֥֥֥֥֥֥֥g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Ϡ֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥եե֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥ǚ,$$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,345556 6!!7!!7!!7""8##8##8##9$$9$$9%%:%%:%%:&&:$$91 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3PPWdddfffffffffffffffffffffdde>>K- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )4IIRffffffffffffffffffffffffaab@@L/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('K;!֥֥֥֥֥֥֥֥֥֥֥֥֥֥g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#Ϡ֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥եե֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥̝[G ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )2456 6 6 7!!7""8##8##8##9$$9$$9%%:%%:%%:&&:&&;'';'';!!6, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ())>KaabeeefffffffffffffffffffffbbcAAM2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )""8KKSffffffffffffffffffffffffeeeXX\11B+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('O>!֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤˛bL ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/!!7""8##8##8$$9%%:%%:%%:&&:&&;'';((;((<((<))<))=**=**=**=++>++>##8, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.CCNccceeefffffffffffffffffffffbbcFFP5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )%%:OOVffffffffffffffffffffffffeee[[^55E, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&}`֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3#ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤Пo ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*!!6##8##9$$9$$9%%:&&:&&;'';'';((<((<))<))=**=**=**=++>++>,,>,,?**<2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0GGPddeeeffffffffffffffffffffffbbcJJS$$9* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+,,>SSZffffffffffffffffffffffffeef\\_99G- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤ԣ& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3##8$$9%%:%%:&&:&&;'';((;((<))<))<))=**=**=++>++>,,>,,?--?--?--?$$9, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1IIRdddffffffffffffffffffffffffccdRRY//@. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (077FZZ^ffffffffffffffffffffffffeee]]`<++>++>,,?--?--?--?..@..@++=2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2EEOddeffffffffffffffffffffffffeee[[^;;I3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (""8DDObbcffffffffffffffffffffffffeee\\_::G/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('TC ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤ʚhQ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5%%9&&:&&;((;((<))<))<))=**=**=++>++>,,>--?--?--?..@..@//@//A//A%%9, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0AAMccdfffffffffffffffffffffffffff``bGGQ%%:* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*--?QQXfffffffffffffffffffffffffffeeeZZ^66E. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&f֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤Рs ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.&&:'';'';((<))<))=**=**=++>++>,,>,,?--?--?..@..@//@//A//A00A00B--?3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/<++>,,?--?--?..@..@..@//A//A00A00B11B11B11B%%:+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-88F^^afffffffffffffffffffffffffffeee\\_EEP((<, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.00BLLTbbceeeffffffffffffffffffffffffddeVV[..?+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ';/"Ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤Ƙ^I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/((;))<**=**=++>++>,,>,,?--?--?..@..@//@//A00A00A11B11B22B22C33C..@3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,22BYY\ffffffffffffffffffffffffffffffccdUU[<++>,,>--?--?..@..@//@//A//A00A00B11B22B22C22C33C33C33C'':, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+**=MMUeefffffffffffffffffffffffffffffff``bMMU22C0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (4::HTTZdddfffffffffffffffffffffffffffeefaacEEO""8 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '%֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գ5+# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0))<++>++>,,?--?--?..@..@//@//A00A00A11B11B22C22C33C33C44D44D44D11A4 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )6@@L``bffffffffffffffffffffffffffffffdde[[^HHQ11B1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (588FMMT``beeefffffffffffffffffffffffffffeee[[_77F2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'K; Ӣ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤ȚpW ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%%9,,>,,?--?--?..@..@//A//A00A00B11B22B22C33C33C33C44D44D55D55E66E++>/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/44DXX\fffffffffffffffffffffffffffffffffddd[[^JJR33C1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )5::GOOV__aeeeffffffffffffffffffffffffffffffddeRRX**=, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('n֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤ҡ}& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1--?--?..@..@//@//A00A00A11B11B22C22C33C33C44D44D55D55E66E66E77F55D$$8* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,((;LLUeeffffffffffffffffffffffffffffffffffdde\\_LLT66E3 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*""7==JPPW__aeeeffffffffffffffffffffffffffffffeefcceDDO 5 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '$%ŗ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤g& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3"ϟ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤գգ֤դդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդգE7! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )((<..@..@//@//A00A00B11B22B22C33C33C44D44D44D55E55E66E77F77F77F88G11B2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )5<>K5* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('դդդդդդդդդդդդդդդդդդդg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?3"ΟդդդդդդդդդդդդդդդդդդդդդդդդդգգդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդդӢ#$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*++>//A00A00B11B22C22C33C33C44D44D55E55E66E77F77F88F88G99G99G99H::H66E!!6 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )211BTTYffffffffffffffffffffffffffffffffffffffffffeee__aVV[LLT>>K--?3 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (, 622BBBNOOVXX]aaceeeffffffffffffffffffffffffffffffffffffffffffMMT'';. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '0'#̝դդդդդդդդդդդդդդդդդդդg& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?3"ΟդդդդդդդդդդդդդդդդդդդդդդդդդգգդգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգWD ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (400A11B11B22C22C33C44D44D55D55E66E66E77F77F88F88G99G99H::H::H;;I;;I11A0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+ 5==I\\_fffffffffffffffffffffffffffffffffffffffffffffeee``bZZ^TTYKKT<>K>>K>>K..@. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )-!!7<>K>>K??K??K==J##8) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,455DPPWaacffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff__aIIR--?1* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&Ƙգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"ΞգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգԢA2" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (***=55E55E66E77F77F88G99G99G::H::H;;I;;I<>K>>K>>K??K??L@@LAAL66F2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+.##8>>JXX\ddeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdRRX66E4-) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (UA Ԣգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"Ξգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգǘw[ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (044D66E77F77F88G99G99G::H::H;;I<>K>>K??K??K@@L@@LAAMAAMAAL++=, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )+/**=FFP\\_eeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdddWW[??K##8.* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (zգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"Ξգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգӡ{% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )$$877F77F88G99G99G::H::H;;I<>K>>K??K??L@@LAALAAMBBMBBMCCN??K""7 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )+.""877FMMU__aeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddeZZ^GGQ11B4.+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&%Ξգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"ΞգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգP> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,11B88G99G99G::H::H;;I<>K>>K??K??L@@LAALAAMBBMBBNCCNCCNDDO;;I2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()+.%%9;;HNNV\\_ddeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcccYY]IIR55D6-* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (kRԢգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"ΞգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգϞl' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )488G99G::H::H;;I<>K>>K??K@@L@@LAAMAAMBBMBBNCCNCCNDDODDOEEO55D/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+0""7//@<5.+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('Ԣգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"ΞգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգԢH9! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*++>::H::H;;I<>K??K??K@@L@@LAAMBBMBBMCCNCCNDDODDOEEOEEPFFPFFP++>, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ***,/36$$9))<((;##852/,** * ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (`KПԢգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"ΞգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգΞi ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/88G;;I<>K>>K??K@@LAALAAMBBMBBMCCNCCNDDODDOEEOFFPFFPGGQGGQEEO!!7 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('Ԣգգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"ΞգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգԢC5" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*$$9;;I<>K>>K??K@@LAALAAMBBMBBNCCNCCNDDODDOEEPFFPFFPGGQGGQHHQHHRAAL2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ZGΝԢգգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"Ξգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգ͝d & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,44C==J>>K>>K??K??L@@LAAMBBMBBMCCNCCNDDODDOEEPFFPFFPGGQHHQHHRHHRIIRJJSJJS99G. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&Ӣգգգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"Ξգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգ?2! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )4<>K??K??L@@LAAMAAMBBMCCNCCNDDODDOEEPFFPFFPGGQHHQHHRIIRIIRJJSKKSKKTLLT--@, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (VC̜գգգգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"Ξգգգգգգգգգգգգգգգգգգգգգգգգգգբգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգգ˜|`' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+,,>>>J??K@@LAALAAMBBMCCNCCNDDODDOEEPFFPFFPGGQHHQHHRIIRIISJJSKKSKKTLLTLLTJJS##8 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('ҡգգգգգգգգգգգգգգգգգգգգգգգգգf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"ΞգգգգգգգգգգգգգգգգգգգգգգգգգգբգԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢ;/" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (099H@@LAALAAMBBMBBNCCNDDODDOEEOFFPFFPGGQHHQHHRIIRIISJJSKKSKKTLLTLLTMMUMMUEEN2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (P? șԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢգԡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢəv[ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*%%9>>KAAMBBMBBNCCNCCNDDOEEOFFPFFPGGQGGQHHRIIRIIRJJSKKSKKTLLTLLTMMUMMUNNVNNV;;H. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('|џԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢӡԡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢ~8-" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-22C@@LBBMCCNCCNDDODDOEEPFFPGGQGGQHHQHHRIIRJJSKKSKKTLLTLLTMMUMMUNNVOOVOOVPPW//@, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (M= ŗԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢӡԡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢƗqW& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2::HBBNCCNDDODDOEEPFFPFFPGGQHHQHHRIIRIISJJSKKTLLTLLTMMUMMUNNVOOVOOVPPWQQWOOV))=+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&wОԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢӡԡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢ{5*" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*!!7>>KCCNDDOEEOFFPFFPGGQGGQHHRIIRIISJJSKKTKKTLLTMMUMMUNNVOOVOOVPPWQQWQQXRRXNNV&&:* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (I9 ”ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢӡԡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢĖkS& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,++>AAMDDOEEPFFPGGQGGQHHQHHRIIRJJSKKSKKTLLTMMUMMUNNUNNVOOVPPWQQWQQXRRXRRYSSYMMU$$8 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&rΞԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢӡԡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢw1(# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/44CDDNFFPFFPGGQHHQHHRIIRIISJJSKKTLLTLLTMMUNNUNNVOOVPPWPPWQQXRRXRRYSSYSSYTTZMMT!!6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (D6 ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢf& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2"͝ԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢӡԡԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢfP& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3<FFPNNUNNVOOVPPWQQWQQXRRXSSYSSYTTZUUZVV[VV[WW\XX]YY]ZZ]ZZ^[[^\\_\\_^^`__a__a``b^^`IIR!!7 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@3 ҠԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡҠe =.1&}_ ԡԡԡԡԡԡԡԡԡԡԡԡԡӡԡ ԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡ“`J& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-//@GGQNNVOOVPPWPPWQQXRRXSSYSSYTTZUUZVV[VV[WW\XX\XX]YY]ZZ^[[^[[_\\_]]`^^`__a__a``b^^`LLT%%: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%gʙԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡϝ aJYCz Ӡԡԡԡԡԡԡԡԡԡԡԡӡԡ ԡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡ|:.! ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/33CJJROOVPPWPPWQQXRRXRRYSSYTTZUUZUU[VV[WW\WW\XX]YY]ZZ]ZZ^[[^\\_]]`]]`^^a__a__a``b^^`OOV**=) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'ZFӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡҠ N< C3 ӡӡӡӡӡӡӡӡӡӡӡӡҡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡ˛w[ % ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (066EKKSOOVPPWQQWQQXRRXSSYSSYTTZUUZVV[VV[WW\XX\XX]YY]ZZ^ZZ^[[^\\_]]`]]`^^`__a__a__a^^aQQX..>+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0&#uϞӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡƗuY  [EŖ ӡӡӡӡӡӡӡӡӡӡӡҡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡM<& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (299GMMTPPWPPWQQXRRXRRYSSYTTZUUZUU[VV[WW\WW\XX]XX]YY]ZZ^[[^\\_\\_]]`]]`]]`^^a__a__a^^`SSX11A, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&rXÕӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡΝx !d џӡӡӡӡӡӡӡӡӡӡҡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡџn+## ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3<& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+)), ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('YEҠӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡ G63' ӡӡӡӡӡӡӡӡӡ ҡ ӡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡΝl#$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*""7DDNPPVQQWQQXRRXRRXSSYSSYSSYTTZUUZUU[VV[VV[VV[VV[WW\WW\WW\WW\WW\WW\WW\WW\WW\WW\WW\VV[VV[UUZMMT66E1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A3 }Оӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡǘ kQD3͜ ӡӡӡӡӡӡӡӡӡ ҡ ӡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡȘlS% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )5BBMNNVPPWQQXQQXRRXRRYSSYSSYSSYTTZUUZUUZUU[UU[VV[VV[VV[VV[VV[VV[VV[VV[VV[VV[VV[UU[UU[UUZUUZPPV>>K!!6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,$#j̛ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡ͜ m `Hӡӡӡӡӡӡӡӡӡӡ ҡ ӡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡL;' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2??KNNUPPWQQWQQXQQXRRXRRYSSYSSYSSYTTZTTZUUZUUZUUZUUZUUZUUZUUZUUZUUZUUZUUZUUZUUZTTZTTZTTZSSYPPWFFP**=, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%qWŖӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡҠ aӡӡӡӡӡӡӡӡӡӡ ҡ ӡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡҠ0'" ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0<- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?2!~ПӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡϞ | iϞ ӡӡӡӡӡӡӡӡӡӡ ҡ ӡ ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡʚmT& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-55EMMTOOVOOVPPWPPWQQWQQWQQXQQXQQXRRXRRXRRXRRXRRXRRXRRXRRXRRXRRXRRXQQXQQXQQXQQXQQWPPWPPWPPWOOVNNUIIR;;I 6* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+##j͜ӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡҠȘ }_ [Fə ӡӡӡӡӡӡӡӡӡӡӡ ҡ ӡ ӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠĕG7' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+00ALLTNNVOOVOOVPPWPPWPPWPPWQQWQQWQQWQQXQQXQQXQQXQQXQQXQQXQQWQQWQQWPPWPPWPPWPPWPPWOOVOOVNNVNNVNNUKKSFFO22C/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%nTɘӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠҟ Q=6) ӠӠӠӠӠӠӠӠӠӠӠӡ ҟ Ӡ ӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠҟ+"# ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*++>LLTNNUNNVNNVOOVOOVOOVPPWPPWPPWPPWPPWPPWPPWPPWPPWPPWPPWPPWPPWOOVOOVOOVOOVNNVNNVNNUMMUMMUMMULLTLLTIIR@@L'';+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('S@ҟӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠО iO VA О ӠӠӠӠӠӠӠӠӠӠӠӟ ҟ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ О r& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )&&:KKSLLTNNUNNUNNVNNVNNVNNVOOVOOVOOVOOVOOVOOVOOVOOVOOVNNVNNVNNVNNVNNVNNUMMUMMUMMUMMULLTLLTLLTKKTKKTJJRFFP88F3 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (;.!ў Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ ў ǖ r3&"jƖ ў Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ ӟ ҟ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Μ mS' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 6IIRMMUMMUMMUMMUMMUNNUNNUNNUNNUNNUNNVNNVNNUNNUNNUNNUMMUMMUMMUMMUMMUMMULLTLLTLLTKKTKKTKKSJJSJJSIISIIRGGQCCN..@- ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()!#iϝ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ ҟ Ϝ aN;( "I7uY Λ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ Ӡ ӟ ҟ Ӡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ ʙ F7 ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1BBNLLTLLTLLTLLTMMUMMUMMUMMUMMUMMUMMUMMUMMUMMUMMULLTLLTLLTLLTLLTLLTKKTKKTKKTKKSJJSJJSIISIIRIIRHHRHHRGGQEEO>>K""8* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%lS̛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ ͜ ʚ ǘ { mllXC) hllllu ǘ ʙ ̛ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ ӟ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ ” 6*! ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+55EKKTKKTLLTLLTLLTLLTLLTLLTLLTLLTLLTLLTLLTLLTLLTKKTKKTKKTKKTKKSJJSJJSJJSIISIIRIIRHHRHHRHHQHHQGGQGGQFFPEEODDN77E3 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&]HƗ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ О Ϟ Ϟ Ϟ c$ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=0ș Ϟ Ϟ Ϟ Ϟ О џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ )!$ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('':HHRKKSKKSKKSKKTKKTKKTKKTKKTKKTKKTKKSKKSKKSJJSJJSJJSJJSIISIISIIRIIRIIRHHRHHRHHQGGQGGQGGQFFPFFPFFPEEPEEOCCNCCN77E3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('R@”џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ $ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1??KHHRIIRIIRIIRIIRIIRIIRIIRIIRIIRIIRHHRHHRHHRHHRHHRHHQHHQGGQGGQGGQGGQFFPFFPFFPEEPEEOEEODDODDOCCNCCNCCNBBMBBMAAM77E4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&G8Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ & ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+22CGGQHHQHHQHHQHHQHHQHHQHHQHHQHHQHHQGGQGGQGGQGGQGGQGGQFFPFFPFFPFFPEEPEEOEEODDODDODDOCCNCCNCCNBBMBBMAAMAAMAAL@@L??L66F4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ' &=0 Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ x& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )&&:CCNGGPGGQGGQGGQGGQGGQGGQGGQGGQGGQFFPFFPFFPFFPFFPFFPEEPEEOEEODDODDODDOCCNCCNCCNBBNBBMBBMAAMAAMAAL@@L@@L??K??K>>K>>K77F4 ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '5+!Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ m& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2;;HEEOFFPFFPFFPFFPFFPFFPFFPFFPEEPEEPEEOEEOEEOEEODDODDODDOCCNCCNCCNCCNBBNBBMBBMAAMAAMAAL@@L@@L??K??K>>K>>K==J==J==J;;H55E 6) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '.%"{Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ϟ }`& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-00ABBMEEOEEOEEOEEOEEOEEOEEODDODDODDODDODDOCCNCCNCCNCCNBBNBBNBBMBBMAAMAAMAAL@@L@@L@@L??K??K>>K>>K>>K==J==J<1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ ͜ lT& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*%%9>>KCCNDDODDODDOCCNCCNCCNCCNCCNCCNCCNBBNBBNBBMBBMBBMAAMAAMAALAAL@@L@@L??L??K??K>>K>>K==J==J==J<1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ ʙ _I& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )277E@@LCCNCCNCCNBBNBBNBBNBBMBBMBBMBBMAAMAAMAAMAAL@@L@@L@@L@@L??K??K>>K>>K>>K==J==J==J<1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ ŕ R@' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,++>;;I@@LBBMAAMAAMAAMAAMAAMAALAAL@@L@@L@@L@@L??L??K??K>>K>>K>>K>>K==J==J==J<1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ H8' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )222B==IAAL@@L@@L@@L@@L@@L@@L??L??K??K??K>>K>>K>>K>>K==J==J==J<1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ О ?2  ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+##866E==J??K??K??K??K>>K>>K>>K>>K>>K==J==J==J==J<1 ˛ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ Ҡ џ џ Ҡ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ϝ 7,! ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (/++=88F<>K>>K>>K==J==J==J==J==J<%%:4/,* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&L<” ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˚ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ ў ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ Μ |8+ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*4//A99G==J==J<++>++>((;!!72.+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&I8ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˚ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ ў ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ Μ A3& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,$$933B::G<++>++>**=**=))=))<((<$$951-+* ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '%S@ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˚ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ ў ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ Ϝ K9% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0))<55D99G::H::H::H99H99G99G99G88G88G88F77F77F77F77F66E66E55E55E55D44D33C33C33C22C22C11B11B00B00A//A//A//@..@..@--?--?,,?++>++>**=**=))=))<))<((<((;'';&&:&&:%%:!!73/,+* ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($^Gŕ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˚ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ ў ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ Н VB% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*4-->66D99G99G88G88G88G88F77F77F77F77F66E66E66E55E55D44D44D44D33C33C22C22C11B11B00B00A00A//A//@..@..@--?--?,,?,,>++>++>**=**=))=))<((<((<'';'';&&:&&:%%:$$9$$9##9##8""7420/,++* ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($jQ˙ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˚ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ ў ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ў _J% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-""8//@66D77F77F77F77F77F66E66E66E55E55E55D44D44D44D33C33C33C22C11B11B00B00A00A//A//@..@..@--?--?--?,,?++>++>**=**=**=))<))<((<((;'';&&;&&:%%:%%:$$9$$9##9##8""8!!7!!7 7 665521/.,+* ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($$uZΜ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>1 ˚ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ ҟ џ ў ҟ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ О jQ"# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0%%9..@44C66E66E66E55E55D55D44D44D44D33C33C33C22C22C22B11B00B00A00A//A//@..@..@..@--?--?,,?,,>++>++>**=**=))=))<((<((<((;'';&&;&&:%%:%%:$$9$$9##9##8""8!!7!!7 7 665554433321.-,,++** ) ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+#"cΜ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ d% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@2ʚ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ uZ' # ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )0##8,,>33B44D44D44D44D33C33C33C33C22C22C22B11B11B00A00A//A//@..@..@..@--?--?,,?,,>++>++>**=**=))=))<))<((<((;'';'';&&:&&:%%:%%:$$9$$9##8##8""8!!7!!7 6 6655544332221100///..--,,+** * ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3)!lΝ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ k&$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (P?˛ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ b-%" ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )/!!7**=11B33C33C33C22C22C22B11B11B11B00A00A//A//@..@..@..@--?--?,,?,,>++>++>**=**=**=))=))<((<((<'';'';&&;&&:%%:%%:$$9$$9##9##8""8""8!!7!!7 6 6655444332221100///..--,,,++** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ';/ uΜ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ y8-! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (tY͜ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Õ i4)! ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (. 6));//@11B11B11B11B00B00A00A//A//A..@..@..@--?--?,,?,,>++>++>++>**=**=))=))<))<((<((;'';&&;&&:&&:%%:%%:$$9$$9##9##8""8!!7!!7 7 66655444332221110///..--,,,++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 'E6|͜ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ L< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (uϝ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Ɨ n;. & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-5&&;--@//A00A//A//A//@..@..@--?--?--?,,?,,>++>++>++>**=**=))=))<))<((<((;'';'';&&:&&:%%:%%:$$9$$9##9##8""8""8!!7!!7 7 66555444332221110///..--,,,++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&M<Μ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ĕ bL ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (& О џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ə tC5& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (-4$$9,,>--?..@..@..@--?--?,,?,,>++>++>++>**=**=))=))<))<((<((<'';'';&&;&&:%%:%%:%%:$$9$$9##9##8""8!!7!!7!!7 6 665554433322111100//..--,,,++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&XDΝ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Ϟ i& # ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N=ə џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ˚ yK:& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,2""8**=,,>--?,,?,,>++>++>**=**=**=))=))<))<((<((<'';'';&&;&&:&&:%%:%%:$$9$$9##9##8""8""8!!7!!7 7 6665544433322111000/...--,,,++** * ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%aKϝ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ aL& ( ( ( ( ( ( ( ( ( ( ( ( ( ( (' #}Ν џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ͜ VC% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,1 6&&:**=++>**=**=**=))=))<))<((<((<'';'';&&;&&:&&:%%:%%:$$9$$9$$9##8##8""8!!7!!7!!7 6 6655544433222111000//..--,,,++*** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#$lS ϝ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ~@3 ' ( ( ( ( ( ( ( ( ( ( ( ( (&|_ʚ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ўџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Ν kR(!# ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*.2!!7&&:))=))<((<((<((;'';'';&&;&&:&&:%%:%%:$$9$$9$$9##9##8""8""8!!7!!7 7 66655444333222111000//..--,,,++*** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '7,!a О џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ʚ l9- & ( ( ( ( ( ( ( ( ( ( ($^I О џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џўџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ f;. & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,/3 7&&:'';'';&&;&&:&&:%%:%%:$$9$$9$$9##9##8""8""8!!7!!7 7 6 6655544433322111100///..--,,,++**) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%N=tȘ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Ɩ vXD$ ( ( ( ( ( ( ( ( '8- {_ ϝ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џўџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ǘ wR@% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ),/3 7%%9%%:%%:$$9$$9$$9##9##8""8""8!!7!!7 7 6 66555444333222111000///..--,,+++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($#hP̛ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ ϝ {_L<0'!% ' (&%"=0bLwə О џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џўџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Μ mT&# ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *,/2 6$$9##9##8""8""8!!7!!7!!7 6 666555444333222111000//...--,,+++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '7, c ϝ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Ɨ viv[qWcp| Ν џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џўџ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў g:- & ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*,/26!!7!!7!!7 7 666555444333222111100///...--,,+++* * ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&P=uƖ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ʙ Ǘ Μ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў џѝў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ȗ yR@% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*,/14665554443332221111000///..---,,++** * ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##jQ̚ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ѝѝў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў Μ oV$# ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+-/13444333222111100///...---,,++** * ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '7- e Ϝ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ѝѝў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў j8,!' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,-/22221111000///...--,,,++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&P>vƕ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ѝѝў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ȗ {R?& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )+,-/01000///...---,,,++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (##kR˚ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ѝѝў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў Μ rW!$ ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )*+,-.//...--,,,+++** ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '7+ f ϝ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ѝѝўў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў m5*  ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) )*+++,,,,+++** ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&P=yƖ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ѝѝўў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ɘ gO% ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) * * ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '/&!{^ ̚ ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ў ѝѝўО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝ uF6' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($^H}Ô ϝ О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ѝНОО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ˚ b'!" ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&?3n ͛ О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝНОО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О Ɩ _J& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&#uZ ə О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝНОО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝ v;. ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%UB~ŕ ϝ О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝНОО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ̛ |`% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '4*!l ͛ О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝНОО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О Ș VC ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%nU ʙ О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝНОО О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О Μ Ô t2( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&I9Ǘ ϝ О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О ϝНООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООϝ̛ tY% ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ')!"iƗ͜ОООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООϝНООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООϝʙ N= ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '%eN ̛ОООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООϝНОООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООϝΜȘ P>' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&eO ̛ϝООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООϝНОННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϜϜ˙ UA& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (%lR ϜϜННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН͛ [F$ ' ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ' '$rWŕННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН͛ aJ% ' ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ' '$$x[ŕϜНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННΜ fN##& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&*""}_ƖϜНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϜ kS)!"& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&2( dƕ ϜНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϜ pV.%!% ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '%9-gƕ ϜНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН vY4) %& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&$@2jƕННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН nR@)!"% & ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&$0&!bLzȗННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННΜ ~`D5%#% ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (&$)!"S@l ϜННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННϝННϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝʙ~ mS;."#& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '%&"G7}_ ̚ϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝΝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝ” s[G3) $& ' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '&##1????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????UDJ-Desktop-Client-0.6.4/src/PlaybackErrorMessage.cpp0000664000175000017500000000336312051252546021763 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "PlaybackErrorMessage.hpp" #include #include #include #include #include "DataStore.hpp" namespace UDJ{ PlaybackErrorMessage::PlaybackErrorMessage(const QString& title, const QString& message, QWidget *parent, Qt::WindowFlags f): QDialog(parent, f) { setWindowTitle(title); errorMessage = new QLabel(message, this); errorMessage->setWordWrap(true); okButton = new QPushButton(tr("Ok"), this); dontShowAgain = new QCheckBox(tr("Don't show this message again")); QGridLayout *layout = new QGridLayout(); layout->addWidget(errorMessage, 0,0,1,3); layout->addWidget(dontShowAgain, 1,0,1,1); layout->addWidget(okButton, 1,2,1,1); setLayout(layout); setModal(true); connect( okButton, SIGNAL(clicked()), this, SLOT(accept())); connect( dontShowAgain, SIGNAL(toggled(bool)), this, SLOT(dontShowAgainChecked(bool))); } void PlaybackErrorMessage::dontShowAgainChecked(bool checked){ DataStore::setDontShowPlaybackError(checked); } } //end Namespace UDJ-Desktop-Client-0.6.4/src/MusicModel.hpp0000664000175000017500000000366212051252546017766 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef MUSIC_MODEL_HPP #define MUSIC_MODEL_HPP #include namespace UDJ{ class DataStore; /** * \brief An abstract class representing a model that contains music. */ class MusicModel : public QSqlQueryModel{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a Music Model * * \param query Query used to obtain the actual data in the model. * \param dataStore The datastore backing the client. * \param parent The parent object. */ MusicModel(const QString& query, DataStore *dataStore, QObject *parent); //@} /** @name Overridden from QSqlQueryModel */ //@{ /** \brief . */ virtual QVariant data(const QModelIndex& item, int role) const; //@} public slots: /** @name Public Slots */ //@{ /** * \brief Refreshes the data in the model */ void refresh(); /** * \brief Refreshes the data in the model with a new query. * * \param query New query which should back the model. */ void refresh(QString query); //@} private: /** @name Private Memebers */ //@{ /** \brief DataStore backing the client */ DataStore *dataStore; /** \brief Query used to populate the model with data. */ QString query; //@} }; } #endif //MUSIC_MODEL_HPP UDJ-Desktop-Client-0.6.4/src/PlayerCreateDialog.cpp0000664000175000017500000000331712051252546021415 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "PlayerCreateDialog.hpp" #include "PlayerCreationWidget.hpp" #include #include "DataStore.hpp" namespace UDJ{ PlayerCreateDialog::PlayerCreateDialog(DataStore *dataStore, QWidget *parent, Qt::WindowFlags f) :DialogWithLoaderWidget( tr("Creating Player..."), tr("Create Player"), tr("Cancel"), true, parent, f), dataStore(dataStore) { setWindowTitle(tr("Player Setup")); setModal(true); setupUi(); } void PlayerCreateDialog::accept(){ showLoadingText(); createWidget->doCreation(); } void PlayerCreateDialog::reject(){ QDialog::reject(); QApplication::quit(); } void PlayerCreateDialog::setupUi(){ createWidget = new PlayerCreationWidget(dataStore, this); setMainWidget(createWidget); setNegativeButtonEnabled(false); connect( createWidget, SIGNAL(playerCreated()), this, SLOT(closeDialog())); connect( createWidget, SIGNAL(playerCreateFailed()), this, SLOT(showMainWidget())); } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/PlaybackErrorMessage.hpp0000664000175000017500000000404312051252546021764 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef ERROR_MESSAGE_HPP #define ERROR_MESSAGE_HPP #include class QPushButton; class QLabel; class QCheckBox; namespace UDJ{ class DataStore; /** * \brief Dialog for displaying a playback error message */ class PlaybackErrorMessage : public QDialog{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Creates a PlaybackErrorMessage. * * \param title Title of the error message. * \param message The message to be displayed * \param parent The parent widget. * \param f Any window flags. */ PlaybackErrorMessage(const QString& title, const QString& message, QWidget *parent=0, Qt::WindowFlags f=0); //@} private: /** @name Private Memeber */ //@{ /** \brief A label displaying the error message. */ QLabel *errorMessage; /** \brief The button used to dismiss the dialog. */ QPushButton *okButton; /** \brief A checkbox indicating whether or not to * display the error message again if the error arrises again. */ QCheckBox *dontShowAgain; //@} private slots: /** @name Private Slots */ //@{ /** \brief Takes appropriate action when the dontShowAgain * checkbox is checked or unchecked. * * \param checked Whether or not the checkbox is now checked. */ void dontShowAgainChecked(bool checked); //@} }; } //end namespace UDJ #endif //ERROR_MESSAGE_HPP UDJ-Desktop-Client-0.6.4/src/MusicModel.cpp0000664000175000017500000000351312051252546017754 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "MusicModel.hpp" #include "DataStore.hpp" #include namespace UDJ{ MusicModel::MusicModel( const QString& query, DataStore *dataStore, QObject *parent) :QSqlQueryModel(parent), dataStore(dataStore), query(query) { refresh(); } void MusicModel::refresh(){ setQuery(query, dataStore->getDatabaseConnection()); } void MusicModel::refresh(QString newQuery){ query = newQuery; setQuery(newQuery, dataStore->getDatabaseConnection()); } QVariant MusicModel::data(const QModelIndex& item, int role) const{ if(role == Qt::TextAlignmentRole){ return QVariant(Qt::AlignLeft | Qt::AlignVCenter); } int durationColIndex = record().indexOf(DataStore::getLibDurationColName()); QVariant actualData = QSqlQueryModel::data(item, role); if(item.column() == durationColIndex && role == Qt::DisplayRole){ int seconds = actualData.toInt() % 60; int minutes = actualData.toInt() / 60; QString secondsString = seconds < 10 ? "0" + QString::number(seconds) : QString::number(seconds); return QString::number(minutes) + ":" + secondsString; } else{ return actualData; } } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/JSONHelper.hpp0000664000175000017500000001647512051252546017644 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef JSON_HELPER_HPP #define JSON_HELPER_HPP #include "ConfigDefs.hpp" #include #include class QNetworkReply; namespace UDJ{ /** \brief Class used to help serialize and deserialize JSON messages */ class JSONHelper{ public: /** @name Converter Functions */ //@{ /** * \brief Given a set of library ids, gets a QByteArray JSON representation of the * library ids. * * @param libIds Ids to convert to JSON. * @return A QByteArray JSON representation of the given library ids. */ static QByteArray getJSONLibIds(const QSet& libIds); /** * \brief Extracts a set of library song ids from a QByteArray JSON repsenation. * * @param idsString A QByteArray of JSON with the song ids to be extracted. * \return A set of library song ids in the given idsString. */ static QSet extractSongLibIds(const QByteArray& idsString); /** * \brief Gets the json needed for adding the given songs to add to the library. * * @param songsToAdd Songs that should be converted to JSON. * @return A JSON representation of the songs to be added. */ static QByteArray getJSONForLibAdd(const QVariantList& songsToAdd); /** * \brief Gets the json needed for adding the given songs to add to the library. * * @param songsToAdd Songs that should be converted to JSON. * @param success A boolean that will be set to true or false depending on wether or not the * JSON was succesfully created. * @return A JSON representation of the songs to be added. */ static QByteArray getJSONForLibAdd(const QVariantList& songsToAdd, bool &success); /** * \brief Gets the json needed for deleting the given songs from a library. * * @param songsToDelete Songs that should be converted to JSON. * @return A JSON representation of the songs to be removed. */ static QByteArray getJSONForLibDelete(const QVariantList& songsToDelete); /** * \brief Gets the json needed for deleting the given songs from a library. * * @param songsToDelete Songs that should be converted to JSON. * @param success A boolean that will be set to true or false depending on wether or not the * JSON was succesfully created. * @return A JSON representation of the songs to be removed. */ static QByteArray getJSONForLibDelete(const QVariantList& songsToDelete, bool &success); /** * \brief Gets the json needed for creating a player. * * @param playerName Name of the player to be created. * @param password Password of the player to be created. * @return A JSON representation of the player to be created. */ static const QByteArray getCreatePlayerJSON( const QString& playerName, const QString& password); /** * \brief Gets the json needed for creating a player. * * @param playerName Name of the player to be created. * @param password Password of the player to be created. * @param success A boolean that will be set to true or false depending on wether or not the * JSON was succesfully created. * @return A JSON representation of the player to be created. */ static const QByteArray getCreatePlayerJSON( const QString& playerName, const QString& password, bool &success); /** * \brief Gets the json needed for creating a player. * * @param playerName Name of the player to be created. * @param password Password of the player to be created. * @param streetAddress Address of the player to be created. * @param city City of the player to be created. * @param state State of the player to be created. * @param zipcode Zip code of the player to be created. * @return A JSON representation of the player to be created. */ static const QByteArray getCreatePlayerJSON( const QString& playerName, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode); /** * \brief Gets the json needed for creating a player. * * @param playerName Name of the player to be created. * @param password Password of the player to be created. * @param streetAddress Address of the player to be created. * @param city City of the player to be created. * @param state State of the player to be created. * @param zipcode Zip code of the player to be created. * @param success A boolean that will be set to true or false depending on wether or not the * JSON was succesfully created. * @return A JSON representation of the player to be created. */ static const QByteArray getCreatePlayerJSON( const QString& playerName, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode, bool &success); /** * \brief Given JSON, this functions extracts a vector containing all of the * library ids that are in it. * * @param payload The JSON from which the library ids should be extracted. * @return A vector containing the extracted library ids. */ static QSet getLibIds(const QByteArray& payload); /** * \brief Given JSON, this fuciton extracts QSet of library ids. The JSON * is assumed to be a simple array with each element being a library id. * * \brief payload JSON to convert. */ static QSet convertLibIdArray(const QByteArray& payload); /** * \brief Get's the id of a player from the given server reply. * * @param reply The reply from the server. * @return The player id in the servers response. */ static player_id_t getPlayerId(QNetworkReply *reply); /** * \brief Gets the active playlist from the JSON given in the server reply. * * \param reply The reply from the server. * \return A QVariantMap representing the playlist given in the server reply. */ static QVariantMap getActivePlaylistFromJSON(QNetworkReply *reply); /** * \brief Gets the list of participants from the JSON given in the server reply. * * \param reply The reply from the server. * \return A QVariantMap representing the participants given in the server reply. */ static QVariantList getParticipantListFromJSON(QNetworkReply *reply); /** * \brief Gets the auth data from a server authentication reply. * * \param reply The reply from the server. * \param success A boolean that will be set to true or false depending on wether or not the * JSON was succesfully created. * \return A QVariantMap representing the auth data retreived from the server. */ static const QVariantMap getAuthReplyFromJSON(QNetworkReply *reply, bool &success); //@} }; } //end namespace UDJ #endif //JSON_HELPER_HPP UDJ-Desktop-Client-0.6.4/src/LICENSE0000664000175000017500000004325412051252546016222 0ustar kurtiskurtis GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. UDJ-Desktop-Client-0.6.4/src/LibraryView.hpp0000664000175000017500000001125212051252546020156 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef LIBRARY_VIEW_HPP #define LIBRARY_VIEW_HPP #include "ConfigDefs.hpp" #include "DataStore.hpp" #include #include class QContextMenuEvent; class QSortFilterProxyModel; class QProgressDialog; namespace UDJ{ class MusicModel; /** *\brief A class for viewing the current contents of the users music library. */ class LibraryView : public QTableView{ Q_OBJECT public: /** @name Constructors */ //@{ /** \brief Constructs a LibraryView * * @param dataStore The data store being used by the applicaiton. * @param parent The parent widget */ LibraryView(DataStore *dataStore, QWidget* parent=0); //@} /** @name Signals */ //@{ signals: /** \brief Emitted when the LibraryView believes the song library needs to be synced. */ void libNeedsSync(); //@} public slots: /** @name Slots */ //@{ /** \brief Filters the contents of the library to be displayed. */ void filterContents(const QString& filter); //@} private slots: /** @name Private Slots */ //@{ /** * \brief Displays a context menu at the given position. * * @param pos The position where the context menu should be displayed. */ void handleContextMenuRequest(const QPoint &pos); //@} private: /** @name Private Memeber */ //@{ /** * \brief The data store backing this instance of UDJ. */ DataStore *dataStore; /** \brief The model backing LibraryView. */ MusicModel *libraryModel; /** \brief The proxymodel backing LibraryView. */ QSortFilterProxyModel *proxyModel; /** \brief Action used for deleting songs from the library. */ QAction *deleteSongAction; /** \brief Action used for adding songs to the player. */ QAction *addToPlaylistAction; /** \brief Dialog representing the progress of the current deletion from the library. */ QProgressDialog *deletingProgress; //@} /** @name Private Functions */ //@{ /** \brief Initilaizes actions. */ void createActions(); /** * \brief Configures the look of the headers in the view. */ void configureColumns(); /** * \brief Gets the name used for the delete context menu item. * * @return The name for the deleted context menu item. */ static const QString& getDeleteContextMenuItemName(){ static const QString deleteContextMenuItemName = tr("Delete"); return deleteContextMenuItemName; } /** * \brief Gets the name used for the add context menu item. * * @return The name for the add context menu item. */ static const QString& getAddToPlaylistContextMenuItemName(){ static const QString addToPlaylistContextMenuItemName = tr("Add To Playlist"); return addToPlaylistContextMenuItemName; } //@} private slots: /** @name Private Slots */ //@{ /** * \brief Deletes the currently selected songs from the library. */ void deleteSongs(); /** * \brief Adds the song located at the given index to the active playlist. * * \param The index of the song to be added to the active playlist. */ void addSongToPlaylist(const QModelIndex& index); /** * * \brief Adds the selected songs to the active playlist. */ void addSongsToActivePlaylist(); /** * \brief Gets the query that should be used to obtain the data to display. * * @return The query that should be used to obtain the data to display. */ static const QString& getDataQuery(){ static const QString dataQuery = "SELECT " + DataStore::getLibIdColName() + ", " + DataStore::getLibSongColName() + ", " + DataStore::getLibArtistColName() + ", " + DataStore::getLibAlbumColName() + ", " + DataStore::getLibDurationColName() + ", " + DataStore::getLibFileColName() + " " + "FROM " + DataStore::getLibraryTableName() + " WHERE " + DataStore::getLibIsDeletedColName() + "=0 AND " + DataStore::getLibSyncStatusColName() + " != " + QString::number(DataStore::getLibNeedsAddSyncStatus()) + ";"; return dataQuery; } //@} }; }//end namespace #endif //LIBRARY_VIEW_HPP UDJ-Desktop-Client-0.6.4/src/PlayerDashboard.hpp0000664000175000017500000000351412051252546020765 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef PLAYER_DASHBOARD_HPP #define PLAYER_DASHBOARD_HPP #include class QLabel; namespace UDJ{ class DataStore; /** * \brief Widget for displaying information about the player */ class PlayerDashboard : public QWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a PlayerDashboard. * * \param dataStore The DataStore backing this client. * \param parent The parent widget. */ PlayerDashboard(DataStore *dataStore, QWidget *parent=0); //@} private slots: /** @name Private Slots */ //@{ /** * \brief Sets the player info to be displayed. */ void setPlayerInfo(); //@} private: /** @name Private Memebers */ //@{ /** \brief The DataStore backing the client */ DataStore *dataStore; /** \brief Lable for player name */ QLabel *nameLabel; /** \brief Label for player password state */ QLabel *passwordLabel; /** \brief Label for player location */ QLabel *locationLabel; //@} /** @name Private functions */ //@{ /** * \brief Sets up UI components */ void setupUi(); //@} }; } //end namespace #endif //PLAYER_DASHBOARD_HPP UDJ-Desktop-Client-0.6.4/src/DialogWithLoaderWidget.hpp0000664000175000017500000000465612051252546022257 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef DIALOG_WITH_LOADER_WIDGET_HPP #define DIALOG_WITH_LOADER_WIDGET_HPP #include class QPushButton; namespace UDJ{ class WidgetWithLoader; /** \brief Dialog with a widget that should be put inside a loader widget. */ class DialogWithLoaderWidget : public QDialog{ Q_OBJECT public: /** @name Constructors */ //@{ DialogWithLoaderWidget( QString loadingText, QString postiveButtonText=tr("Ok"), QString negativeButtonText=tr("Cancel"), bool centerPositiveButton=false, QWidget *parent=0, Qt::WindowFlags f=0); //@} void setMainWidget(QWidget *mainWidget); void setNegativeButtonEnabled(bool enabled); public slots: void showLoadingText(); void showMainWidget(); void closeDialog(); private: /** @name Private Members */ //@{ /** \brief Widget used for containing the actual input widget.*/ WidgetWithLoader *loaderWidget; /** \brief Button used for indicating the postive action should be invoked. */ QPushButton *positiveButton; /** \brief Button for indicating the negative action should be invoked. */ QPushButton *negativeButton; //@} /** @name Private Functions */ //@{ /** \brief Initializes UI. * * \param loadingText The text to show while loading. * \param positiveText The text to display on the positive button. * \param negativeText The text to diplay on the negative button. * \param centerPositiveButton Whether or not the positive button should be centered. */ void setupUi(QString loadingText, QString positiveText, QString negativeText, bool centerPositiveButton); /** \brief whether or not a negative button should be displayed. */ bool negativeButtonEnabled; //@} }; } //end namespace UDJ #endif //DIALOG_WITH_LOADER_WIDGET_HPP UDJ-Desktop-Client-0.6.4/src/ActivePlaylistModel.hpp0000664000175000017500000000276212051252546021643 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef ACTIVE_PLAYLIST_MODEL_HPP #define ACTIVE_PLAYLIST_MODEL_HPP #include "MusicModel.hpp" namespace UDJ{ class DataStore; /** * \brief A class serving as a model for the Active Playlist. */ class ActivePlaylistModel : public MusicModel{ Q_OBJECT public: /** @name Constructor(s) and Destructor */ //@{ /** * \brief Constructs an ActivePlaylistModel * * @param query The query used to back the model. * @param dataStore The DataStore backing this instance of UDJ. * @param parent The parent QObject. */ ActivePlaylistModel(const QString& query, DataStore *dataStore, QObject *parent); //@} /** @name Overridden from MusicModel */ //@{ /** * \brief . */ virtual QVariant data(const QModelIndex& item, int role) const; //@} }; } #endif //ACTIVEPLAYLIST_MODEL_HPP UDJ-Desktop-Client-0.6.4/src/ActivePlaylistView.cpp0000664000175000017500000001100712051252546021500 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "ActivePlaylistView.hpp" #include "ActivePlaylistModel.hpp" #include "Utils.hpp" #include "Logger.hpp" #include #include #include #include #include namespace UDJ{ ActivePlaylistView::ActivePlaylistView(DataStore* dataStore, QWidget* parent): QTableView(parent), dataStore(dataStore) { setContextMenuPolicy(Qt::CustomContextMenu); setFocusPolicy(Qt::TabFocus); setEditTriggers(QAbstractItemView::NoEditTriggers); model = new ActivePlaylistModel(getDataQuery(), dataStore, this); horizontalHeader()->setStretchLastSection(true); createActions(); setModel(model); setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::ContiguousSelection); configureHeaders(); connect( dataStore, SIGNAL(activePlaylistModified()), model, SLOT(refresh())); connect( this, SIGNAL(activated(const QModelIndex&)), this, SLOT(setCurrentSong(const QModelIndex&))); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(handleContextMenuRequest(const QPoint&))); connect( selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(handleSelectionChange(const QItemSelection&, const QItemSelection&))); } void ActivePlaylistView::configureHeaders(){ QSqlRecord record = model->record(); int idIndex = record.indexOf(DataStore::getActivePlaylistLibIdColName()); int downVoteIndex = record.indexOf(DataStore::getDownVoteColName()); int upVoteIndex = record.indexOf(DataStore::getUpVoteColName()); int adderNameIndex = record.indexOf(DataStore::getAdderUsernameColName()); int timeAddedIndex = record.indexOf(DataStore::getTimeAddedColName()); setColumnHidden(idIndex, true); model->setHeaderData( downVoteIndex, Qt::Horizontal, tr("Down Votes"), Qt::DisplayRole); model->setHeaderData( upVoteIndex, Qt::Horizontal, tr("Up Votes"), Qt::DisplayRole); model->setHeaderData( adderNameIndex, Qt::Horizontal, tr("Adder"), Qt::DisplayRole); model->setHeaderData( timeAddedIndex, Qt::Horizontal, tr("Time Added"), Qt::DisplayRole); } void ActivePlaylistView::setCurrentSong(const QModelIndex& index){ Logger::instance()->log("Manual setting of current song"); QSqlRecord songToPlayRecord = model->record(index.row()); QVariant data = songToPlayRecord.value(DataStore::getActivePlaylistLibIdColName()); selectionModel()->clearSelection(); dataStore->setCurrentSong(data.value()); } void ActivePlaylistView::createActions(){ removeSongAction = new QAction(tr("Remove Song"), this); connect( removeSongAction, SIGNAL(triggered()), this, SLOT(removeSongs())); } void ActivePlaylistView::handleContextMenuRequest(const QPoint& /*pos*/){ QMenu contextMenu(this); contextMenu.addAction(removeSongAction); QAction *selected = contextMenu.exec(QCursor::pos()); if(selected==NULL){ selectionModel()->clearSelection(); } } void ActivePlaylistView::removeSongs(){ QSet toRemove = Utils::getSelectedIds( this, model, DataStore::getActivePlaylistLibIdColName()); dataStore->removeSongsFromActivePlaylist(toRemove); selectionModel()->clearSelection(); } void ActivePlaylistView::handleSelectionChange( const QItemSelection& selected, const QItemSelection& /*deselected*/) { if(selected.indexes().size() == 0){ connect( dataStore, SIGNAL(activePlaylistModified()), model, SLOT(refresh())); } else{ disconnect( dataStore, SIGNAL(activePlaylistModified()), model, SLOT(refresh())); } } void ActivePlaylistView::focusOutEvent(QFocusEvent *event){ if(event->reason() != Qt::PopupFocusReason){ selectionModel()->clearSelection(); } } } //end namespace UDJ-Desktop-Client-0.6.4/src/PlayerCreationWidget.cpp0000664000175000017500000000726112051252546022004 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "PlayerCreationWidget.hpp" #include "DataStore.hpp" #include "AddressWidget.hpp" #include #include #include #include #include #include #include namespace UDJ{ PlayerCreationWidget::PlayerCreationWidget( DataStore *dataStore, QWidget *parent): WidgetWithLoader(tr("Creating Player..."), parent), dataStore(dataStore) { setupUi(); connect( dataStore, SIGNAL(playerCreated()), this, SLOT(playerCreateSuccess())); connect( dataStore, SIGNAL(playerCreationFailed(const QString&)), this, SLOT(playerCreateFail(const QString&))); } void PlayerCreationWidget::setupUi(){ QWidget *mainWidget = new QWidget(this); QLabel *welcomeMessage = new QLabel(tr("Welcome to UDJ! We just need you to fill a few things out before you get started. Can you tell us a little information about this music player?")); welcomeMessage->setWordWrap(true); nameEdit = new QLineEdit(); passwordEdit = new QLineEdit(); addressGroup = new QGroupBox(); addressWidget = new AddressWidget(); QGridLayout *addressLayout = new QGridLayout(); addressLayout->addWidget(addressWidget,0,0); addressGroup->setLayout(addressLayout); addressGroup->setCheckable(true); addressGroup->setChecked(false); addressGroup->setTitle(tr("Provide Location")); QFormLayout *formLayout = new QFormLayout; formLayout->addRow(tr("Name of player:"), nameEdit); formLayout->addRow(tr("Password (optional):"), passwordEdit); connect( addressGroup, SIGNAL(toggled(bool)), addressWidget, SLOT(setEnabled(bool))); addressWidget->setEnabled(false); QGridLayout *mainLayout = new QGridLayout(); mainLayout->addWidget(welcomeMessage, 0,0); mainLayout->addLayout(formLayout,1,0); mainLayout->addWidget(addressGroup,2,0); mainWidget->setLayout(mainLayout); setMainWidget(mainWidget); showMainWidget(); } void PlayerCreationWidget::doCreation(){ showLoadingText(); if(nameEdit->text() == ""){ playerCreateFail("You must provide a name for your player." ); return; } if(addressGroup->isChecked()){ QString badInputs = addressWidget->getBadInputs(); if(badInputs == ""){ dataStore->createNewPlayer( nameEdit->text(), passwordEdit->text(), addressWidget->getStreetAddress(), addressWidget->getCity(), addressWidget->getState(), addressWidget->getZipcode()); } else{ playerCreateFail("The address you supplied is invalid. Please correct " "the following errors:\n\n" + badInputs); } } else{ dataStore->createNewPlayer(nameEdit->text(), passwordEdit->text()); } } void PlayerCreationWidget::playerCreateSuccess(){ showMainWidget(); emit playerCreated(); } void PlayerCreationWidget::playerCreateFail(const QString& errMessage){ showMainWidget(); QMessageBox::critical( this, tr("Player Creation Failed"), errMessage); emit playerCreateFailed(); } }//end namespace UDJ UDJ-Desktop-Client-0.6.4/src/WidgetWithLoader.hpp0000664000175000017500000000443712051252546021134 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef WIDGET_WITH_LOADER_HPP #define WIDGET_WITH_LOADER_HPP #include class QLabel; namespace UDJ{ /** \brief A widget which can be in a state of "loading" */ class WidgetWithLoader : public QStackedWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a WidgetWithLoader. * * @param The text to display when the widget is in a loading state. * @param parent The parent widget. */ WidgetWithLoader(QString loadingText, QWidget *parent=0); //@} /** @name Getter */ // @{ /** \brief Determines whether or not the main widget is showing */ inline bool isMainWidgetShowing(){ return mainWidgetIsShowing; } // @} /** @name Setters */ //@{ /** * \brief Sets the main widget that should be displayed when not in a loading * state. * * @param mainWidget The widget that should be displayed when not in a loading * state. */ void setMainWidget(QWidget *mainWidget); //@} public slots: /** @name Public Slots */ //@{ /** * \brief Display the text indicating that the widget is in a "loading" * state. */ void showLoadingText(); /** \brief Display the main widget. */ void showMainWidget(); //@} private: /** @name Private Memebers */ //@{ /** \brief Wether or not the mainwidget is showing right now. */ bool mainWidgetIsShowing; /** \brief Lable used to display the loading text. */ QLabel *loadingLabel; /** \brief Main widget to be displayed when not in a loading state. */ QWidget *mainWidget; //@} }; }//end namespace udj #endif //WIDGET_WITH_LOADER_HPP UDJ-Desktop-Client-0.6.4/src/MusicFinder.cpp0000664000175000017500000001065412051252546020127 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "MusicFinder.hpp" #include "Logger.hpp" #include "ConfigDefs.hpp" #include "DataStore.hpp" #include #include #include #include namespace UDJ{ class iTunesHandler : public QXmlDefaultHandler{ public: bool characters(const QString& ch){ if(ch.startsWith("file://")){ QUrl songUrl(ch); QString file = songUrl.path(); #if IS_WINDOWS_BUILD Logger::instance()->log("Windows build, removing leading slash"); file = file.remove(0,1); #endif Logger::instance()->log("Checking path: " + file); QFileInfo info(file); if(info.isFile()){ foundFiles.append(Phonon::MediaSource(file)); } } return true; } QList foundFiles; }; QList MusicFinder::filterDuplicateSongs( const QList& songsToFilter, const DataStore* dataStore) { QList toReturn; Phonon::MediaSource song; Q_FOREACH(song, songsToFilter){ if(!dataStore->alreadyHaveSongInLibrary(song.fileName())){ toReturn.append(song); } } return toReturn; } QList MusicFinder::findItunesMusic(const QString& itunesLibFileName, const DataStore* dataStore){ iTunesHandler handler; QFile itunesLibFile(itunesLibFileName); QXmlSimpleReader itunesReader; QXmlInputSource *source = new QXmlInputSource(&itunesLibFile); itunesReader.setContentHandler(&handler); itunesReader.setErrorHandler(&handler); itunesReader.parse(source); return filterDuplicateSongs(handler.foundFiles, dataStore); } QList MusicFinder::findMusicInDir(const QString& musicDir, const DataStore* dataStore){ QRegExp fileMatcher = getMusicFileMatcher(); return filterDuplicateSongs(findMusicInDirWithMatcher(musicDir, fileMatcher), dataStore); } QList MusicFinder::findMusicInDirWithMatcher( const QString& musicDir, const QRegExp& fileMatcher) { QList toReturn; QDir dir(musicDir); QFileInfoList potentialFiles = dir.entryInfoList(QDir::Dirs| QDir::Files | QDir::NoDotAndDotDot); QFileInfo currentFile; for(int i =0; i < potentialFiles.size(); ++i){ currentFile = potentialFiles[i]; if(currentFile.isFile() && fileMatcher.exactMatch(currentFile.fileName())){ toReturn.append(Phonon::MediaSource(currentFile.absoluteFilePath())); } else if(currentFile.isDir()){ toReturn.append(findMusicInDirWithMatcher( dir.absoluteFilePath(currentFile.absoluteFilePath()), fileMatcher)); } } return toReturn; } QRegExp MusicFinder::getMusicFileMatcher(){ QStringList availableTypes = availableMusicTypes(); QString matcherString=""; for(int i=0;ilog("Matcher REGEX: " + matcherString); QRegExp matcher(matcherString); return matcher; } QString MusicFinder::getMusicFileExtFilter(){ QStringList availableTypes = availableMusicTypes(); QString filterString="("; for(int i=0;ilog("File Ext Filter: " + filterString); return filterString; } QStringList MusicFinder::availableMusicTypes(){ //We be using vlc backend now. That means we can play ALL THE MUSICS!!!!! QStringList toReturn; toReturn << "flac" << "mp3" << "m4a" << "wav" << "ogg"; return toReturn; } } //end namespace UDJ-Desktop-Client-0.6.4/src/AddressWidget.cpp0000664000175000017500000000770312051252546020451 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "AddressWidget.hpp" #include #include #include namespace UDJ{ AddressWidget::AddressWidget( QWidget *parent, QString streetAddress, QString city, QString state, QString zipcode ):QWidget(parent) { setupStateCombo(state); streetAddressEdit = new QLineEdit(streetAddress); cityEdit = new QLineEdit(city); setupStateCombo(state); zipcodeEdit = new QLineEdit(zipcode); QFormLayout *formLayout = new QFormLayout; formLayout->addRow(tr("Address (Optional):"), streetAddressEdit); formLayout->addRow(tr("City (Optional):"), cityEdit); formLayout->addRow(tr("State:"), stateCombo); formLayout->addRow(tr("Zipcode:"), zipcodeEdit); setLayout(formLayout); } QString AddressWidget::getStreetAddress() const{ return streetAddressEdit->text(); } QString AddressWidget::getCity() const{ return cityEdit->text(); } QString AddressWidget::getState() const{ return stateCombo->currentText(); } QString AddressWidget::getZipcode() const{ return zipcodeEdit->text(); } QString AddressWidget::getBadInputs() const{ QString toReturn =""; /* int errorCounter = 1; if(streetAddressEdit->text() == ""){ toReturn += QString::number(errorCounter++) + ". You did not enter a street address.\n"; } if(cityEdit->text() == ""){ toReturn += QString::number(errorCounter++) + ". You did not enter a city.\n"; } if(!getZipcodeRegex().exactMatch(zipcodeEdit->text())){ toReturn += QString::number(errorCounter++) + ". Zipcode invalid."; }*/ return toReturn; } void AddressWidget::setupStateCombo(const QString& selectedState){ stateCombo = new QComboBox(); stateCombo->addItem("AL"); stateCombo->addItem("AK"); stateCombo->addItem("AZ"); stateCombo->addItem("AR"); stateCombo->addItem("CA"); stateCombo->addItem("CO"); stateCombo->addItem("CT"); stateCombo->addItem("DE"); stateCombo->addItem("DC"); stateCombo->addItem("FL"); stateCombo->addItem("GA"); stateCombo->addItem("HI"); stateCombo->addItem("ID"); stateCombo->addItem("IL"); stateCombo->addItem("IN"); stateCombo->addItem("IA"); stateCombo->addItem("KS"); stateCombo->addItem("KY"); stateCombo->addItem("LA"); stateCombo->addItem("ME"); stateCombo->addItem("MT"); stateCombo->addItem("NE"); stateCombo->addItem("NV"); stateCombo->addItem("NH"); stateCombo->addItem("NJ"); stateCombo->addItem("NM"); stateCombo->addItem("NY"); stateCombo->addItem("NC"); stateCombo->addItem("ND"); stateCombo->addItem("OH"); stateCombo->addItem("OK"); stateCombo->addItem("OR"); stateCombo->addItem("MD"); stateCombo->addItem("MA"); stateCombo->addItem("MI"); stateCombo->addItem("MN"); stateCombo->addItem("MS"); stateCombo->addItem("MO"); stateCombo->addItem("PA"); stateCombo->addItem("RI"); stateCombo->addItem("SC"); stateCombo->addItem("SD"); stateCombo->addItem("TN"); stateCombo->addItem("TX"); stateCombo->addItem("UT"); stateCombo->addItem("VT"); stateCombo->addItem("VA"); stateCombo->addItem("WA"); stateCombo->addItem("WV"); stateCombo->addItem("WI"); stateCombo->addItem("WY"); if(selectedState != "" && stateCombo->findText(selectedState) != -1){ stateCombo->setCurrentIndex(stateCombo->findText(selectedState)); } } }//end namespace UDJ UDJ-Desktop-Client-0.6.4/src/MusicFinder.hpp0000664000175000017500000001047612051252546020136 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef MUSIC_FINDER_HPP #define MUSIC_FINDER_HPP #include #include "phonon/mediasource.h" namespace UDJ{ class DataStore; /** * \brief A class used to find music on a machine. */ class MusicFinder{ public: /** @name Finder Function(s) */ //@{ /** * \brief Finds all the music in a given iTunes library. * * This function parses the given iTunes library file and returns * a list of Phonon MediaSources representing all of the songs * which it found in the given iTunes library. * * @param itunesLibFileName The iTunes library file. * @param dataStore The DataStore being used to back this instance of UDJ. * @return A list of MediaSources corresponding to all the songs found in the iTunes library. */ static QList findItunesMusic(const QString& itunesLibFileName, const DataStore* dataStore); /** * \brief Finds all the music in a given directory. * * Recusrively searchs the given directory and all subdirectories looking * for any music files to be added to the users music library. It then * returns a list of MediaSources representing all of the found songs. * * @param musicDir The directory in which to search for music. * @param dataStore The DataStore being used to back this instance of UDJ. * @return A list of MediaSources corresponding to each found song. */ static QList findMusicInDir(const QString& musicDir, const DataStore* dataStore); /** * \brief Finds all the music in a given directory which matches certain criteria. * * Recusrively searchs the given directory and all subdirectories looking * for any music files to be added to the users music library. It then * returns a list of MediaSources representing all of the found songs. All the file * names of the found songs must match the QRegExp that is provided. * * @param musicDir The directory in which to search for music. * @param fileMatcher QRegExp used to determine if a file is a valid song. * @return A list of MediaSources corresponding to each found song. */ static QList findMusicInDirWithMatcher( const QString& musicDir, const QRegExp& fileMatcher); /** * Examines the system on whitch the client is running, determines what types of music * can be played, and returns a filter for just those file types. * * @return A filter representing the file types of songs that can be played by the client. */ static QString getMusicFileExtFilter(); //@} private: /** @name Private Function(s) */ //@{ /** * Retrieves the regular expression used to help determine if a file * constains music that can be played by the client. * * @return The regular expression user to help determine if a file * constains music that can be played by the client. */ static QRegExp getMusicFileMatcher(); /** * Retrieves a list of all file extensions that can be played by the client. * * @return A list of all file extensions that can be played by the client. */ static QStringList availableMusicTypes(); /** * Given a list of songs, this function returns the same list except all songs which * are already in the library have been removed. * * @param songsToFilter The list of songs to be filtered. * @param dataStore The DataStore backing this instance of UDJ. * @return The list of songs given to the functions with all songs already in the * library removed. */ static QList filterDuplicateSongs(const QList& songsToFilter, const DataStore* dataStore); //@} }; } //end namespace #endif //MUSIC_FINDER_HPP UDJ-Desktop-Client-0.6.4/src/AboutWidget.cpp0000664000175000017500000000262112051252546020130 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "AboutWidget.hpp" #include #include #include "ConfigDefs.hpp" namespace UDJ{ AboutWidget::AboutWidget(QWidget *parent):QWidget(parent){ QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addWidget(new QLabel(tr("UDJ Player Client Version " UDJ_VERSION))); mainLayout->addSpacing(1); mainLayout->addWidget(new QLabel(tr("Written By Kurtis Nusbaum"))); mainLayout->addSpacing(1); QLabel *issuesLabel = new QLabel(tr("Please report all bugs to the UDJ issue tracker")); issuesLabel->setOpenExternalLinks(true); mainLayout->addWidget(issuesLabel); setLayout(mainLayout); } } //end namespace UDJ-Desktop-Client-0.6.4/src/Logger.cpp0000664000175000017500000000224712051252546017135 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "Logger.hpp" #include namespace UDJ{ Logger* Logger::myInstance = NULL; void Logger::deleteLogger(){ if(myInstance != NULL){ delete myInstance; } } Logger* Logger::instance(){ if(myInstance == NULL){ myInstance = new Logger(); } return myInstance; } void Logger::log(QString message){ std::cout << message.toStdString() << std::endl; data.append(message); emit dataChanged(message); } QStringList Logger::getLog(){ return data; } } UDJ-Desktop-Client-0.6.4/src/CMakeLists.txt0000664000175000017500000001365112051252546017753 0ustar kurtiskurtis# Copyright 2011 Kurtis L. Nusbaum # # This file is part of UDJ. # # UDJ is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # UDJ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with UDJ. If not, see . configure_file( "${PROJECT_SOURCE_DIR}/src/ConfigDefs.hpp.in" "${PROJECT_BINARY_DIR}/src/ConfigDefs.hpp" ) INCLUDE( AddAppIconMacro ) SET(SOURCES main.cpp PlaybackWidget.cpp MetaWindow.cpp MusicFinder.cpp DataStore.cpp ActivePlaylistView.cpp LibraryView.cpp UDJServerConnection.cpp JSONHelper.cpp qt-json/json.cpp LoginWidget.cpp ActivityList.cpp PlayerCreationWidget.cpp WidgetWithLoader.cpp MusicModel.cpp LoginDialog.cpp PlayerCreateDialog.cpp simpleCrypt/simplecrypt.cpp LibraryWidget.cpp ActivePlaylistModel.cpp PlayerDashboard.cpp Utils.cpp Logger.cpp LogViewer.cpp AboutWidget.cpp AddressWidget.cpp SetLocationDialog.cpp DialogWithLoaderWidget.cpp PlaybackErrorMessage.cpp ParticipantsView.cpp ParticipantsModel.cpp ) #IF(APPLE) #SET( SOURCES ${SOURCES} mac/UDJApp_Mac.mm) #INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/mac) #ENDIF(APPLE) include_directories("${PROJECT_BINARY_DIR}/src") include_directories("${PROJECT_SOURCE_DIR}/src") if(APPLE AND CMAKE_INSTALL_PREFIX MATCHES "/usr/local") set(CMAKE_INSTALL_PREFIX "/Applications") endif() if(UNIX AND NOT APPLE) string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWERCASE) set(BIN_INSTALL_DIR "bin") set(DOC_INSTALL_DIR "share/doc/${PROJECT_NAME_LOWERCASE}/") else() set(BIN_INSTALL_DIR ".") set(DOC_INSTALL_DIR ".") endif() set(ICONS_DIR "${PROJECT_SOURCE_DIR}/icons") if(CMAKE_COMPILER_IS_GNUCXX OR APPLE) add_definitions(-Wall -Wextra) if(CMAKE_BUILD_RELEASE) add_definitions(-Werror) endif() endif() set(ICON_SOURCES "") kde4_add_app_icon( ICON_SOURCES "${CMAKE_SOURCE_DIR}/icons/udjlauncher*.png" ) if(APPLE) set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}") set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}") set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}") set(MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}") set(MACOSX_BUNDLE_RESOURCES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app/Contents/Resources") set(MACOSX_BUNDLE_ICON "${ICONS_DIR}/${MACOSX_BUNDLE_ICON_FILE}") execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${MACOSX_BUNDLE_RESOURCES}) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MACOSX_BUNDLE_ICON} ${MACOSX_BUNDLE_RESOURCES}) endif() set(UDJ_EXTRA_LIBS "") if(WIN32) list(APPEND UDJ_EXTRA_LIBS ${QTSPARKLE_LIBRARIES}) elseif(APPLE) find_library(SPARKLE Sparkle) list(APPEND UDJ_EXTRA_LIBS ${SPARKLE}) endif(WIN32) message(STATUS "EXTRA ${UDJ_EXTRA_LIBS}") include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) add_executable(${PROJECT_NAME} WIN32 MACOSX_BUNDLE ${SOURCES} ${MOC_SOURCES} ${ICON_SOURCES}) target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES} ${PHONON_LIBS} ${TAGLIB} ${UDJ_EXTRA_LIBS}) if(APPLE) set(CMAKE_INSTALL_PREFIX "/Applications") endif() install(TARGETS ${PROJECT_NAME} DESTINATION ${BIN_INSTALL_DIR}) IF(CUSTOM_CA_CERT) INSTALL(FILES ${PROJECT_BINARY_DIR}/serverca.pem DESTINATION ${BIN_INSTALL_DIR}) ENDIF(CUSTOM_CA_CERT) set(LICENSE_FILE "${PROJECT_SOURCE_DIR}/LICENSE") #set(README_FILE "${PROJECT_SOURCE_DIR}/README.md") set(MANPAGE_FILE "${PROJECT_SOURCE_DIR}/doc/UDJ.1") if(NOT APPLE) install(FILES "${LICENSE_FILE}" "${MANPAGE_FILE}" DESTINATION ${DOC_INSTALL_DIR}) endif() IF(WIN32) #We need to look for and include the openssl libs because some asshole made #openssl export controlled and isn't installed by default on windows FIND_PACKAGE(OpenSSLCross REQUIRED) # get_filename_component(OPENSSL_ROOT ${OPENSSL_INCLUDE_DIR} PATH) # set(SSL_LIBS_DLLS "${OPENSSL_ROOT}/bin/libeay32.dll" "${OPENSSL_ROOT}/bin/ssleay32.dll") # # INSTALL(FILES ${SSL_LIBS_DLLS} DESTINATION ${BIN_INSTALL_DIR}) #Do some fancy foot work to get phonon vlc working on widnows, this is so stupid and I hate it. #vlc libs # get_filename_component(LIBVLC_ROOT ${LIBVLC_LIBRARY} PATH) # set(VLC_LIB_DLLS "${LIBVLC_ROOT}/libvlc.dll") # INSTALL(FILES ${VLC_LIB_DLLS} DESTINATION ${BIN_INSTALL_DIR}) #And the friggen PHONON_VLC_DLL # find_file(PHONON_VLC_DLL phonon_vlc.dll # HINT "$ENV{PHONON_VLC_ROOT_DIR}bin/phonon_backend" # ) # if(NOT PHONON_VLC_DLL) # message(FATAL_ERROR "Could not find phonon vlc backend") # else(NOT PHONON_VLC_DLL) # message(STATUS "Found Phonon VLC Backend DLL: ${PHONON_VLC_DLL}") # endif(NOT PHONON_VLC_DLL) endif() set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}") set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}") set(CPACK_PACKAGE_VENDOR "${PROJECT_VENDOR}") set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/${README_FILE}") SET(CPACK_PACKAGE_DESCRIPTION "UDJ: The Social Music Player") SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libtag1c2a, libqt4-network, libqt4-sql-sqlite, libqtcore4, libqtgui4, phonon") SET(CPACK_PACKAGE_CONTACT "klnusbaum@bazaarsolutions.com") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "UDJ is a social music player that allows you and your friends to controll a single music player from your smart phones") SET(CPACK_DEBIAN_PACKAGE_SECTION "SOUND") UDJ-Desktop-Client-0.6.4/src/ParticipantsView.cpp0000664000175000017500000000267112051252546021213 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "ParticipantsView.hpp" #include "ParticipantsModel.hpp" #include #include namespace UDJ{ ParticipantsView::ParticipantsView(DataStore* dataStore, QWidget* parent): QTableView(parent), dataStore(dataStore) { setFocusPolicy(Qt::TabFocus); setEditTriggers(QAbstractItemView::NoEditTriggers); participantsModel = new ParticipantsModel(dataStore, this); setModel(participantsModel); setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::ContiguousSelection); configureHeaders(); } void ParticipantsView::configureHeaders(){ setColumnHidden(0, true); horizontalHeader()->setResizeMode(QHeaderView::Stretch); verticalHeader()->hide(); } } //end namesapce UDJ UDJ-Desktop-Client-0.6.4/src/DataStore.hpp0000664000175000017500000014216412051252546017614 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef DATA_STORE_HPP #define DATA_STORE_HPP #include #include #include #include #include "ConfigDefs.hpp" #include #include class QTimer; class QProgressDialog; namespace UDJ{ class UDJServerConnection; /** * \brief A class that provides access to all persistent/semi-persistent storage used by UDJ. */ class DataStore : public QObject{ Q_OBJECT public: /** @name Public Typedefs and Enums */ //@{ /** * \brief Actions that can be preformed once the client has reauthenticated. */ enum ReauthAction{ SYNC_LIB, GET_ACTIVE_PLAYLIST, SET_CURRENT_SONG, MOD_PLAYLIST, SET_CURRENT_VOLUME, SET_PLAYER_STATE, SET_PLAYER_INACTIVE, SET_PLAYER_LOCATION, SET_PLAYER_PASSWORD, REMOVE_PLAYER_PASSWORD, CLEAR_CURRENT_SONG }; /** * \brief A minimal set of info describing a song in the database. */ typedef struct { Phonon::MediaSource source; QString title; QString artist; QString duration; } song_info_t; //@} /** @name Constructor(s) and Destructor */ //@{ /** \brief Constructs a DataStore * * @param username The username being used by the client. * @param password The password being used by the client. * @param ticketHash The tickethash being used for communication with the server. * @param userId Id of the user using this client. * @param parent The parent object. */ DataStore( const QString& username, const QString& password, const QByteArray& ticketHash, const user_id_t& userId, QObject *parent=0); //@} /** @name Accessors */ //@{ /** * \brief Checks to see if a particular song is already in * the library and not deleted. * * @param fileName The file to be checked. * @return True if the file is already in the library, false * otherwise. */ bool alreadyHaveSongInLibrary(const QString& fileName) const; inline library_song_id_t getCurrentSongId() const{ return currentSongId; } //@} /** @name Modifiers */ //@{ /** * \brief Adds a list of songs to the music library. * * @param songs The list of songs to be added to the library. * @param progress A progress dialog representing the progress of the * of adding the songs to the library. */ void addMusicToLibrary( const QList& songs, QProgressDialog* progress=0); /** * \brief Clears the current song that is playing. */ void clearCurrentSong(); /** * \brief Removes the password on the player. */ void removePlayerPassword(); /** * \brief Sets the player's password * * \param newPassword The password that should be set for the player. Should be non-blank. */ void setPlayerPassword(const QString& newPassword); /** * \brief Set player location. * * \param streetAddress The street address of the location to be set. * \param city The city of the location to be set. * \param state The state of the location to be set. * \param zipcode The zipcode of the location to be set. */ void setPlayerLocation( const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode ); /** * \brief Sets the player as inactive. */ void setPlayerInactive(); /** * \brief Removes the given songs from the music library. * * @param toRemove A set of song ids to remove from the library. * @param progress A progress dialog representing the progress of the * of removing the songs from the library. */ void removeSongsFromLibrary(const QSet& toRemove, QProgressDialog *progress=0); /** * \brief Gets the raw connection to the actual database that the DataStore * uses. * * @return The connection to the database backing the DataStore. */ QSqlDatabase getDatabaseConnection(); /** * \brief Gets the name of the player. * * @return The name of the player. */ inline const QString getPlayerName() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getPlayerNameSettingName(), tr("Not Set")).toString(); } /** * \brief Gets the id of the player. * * @return The id of the player. */ inline player_id_t getPlayerId() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getPlayerIdSettingName()).value(); } /** * \brief Gets the volume of the player. * * @return The volume of the player. */ inline qreal getPlayerVolume() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getPlayerVolumeSettingName()).value(); } /** * \brief Gets the username being used by the client * * @return The username being used by the client. */ inline const QString& getUsername() const{ return username; } /** * \brief Gets the password being used by the user. * * @return The password being used by the user. */ inline const QString& getPassword() const{ return password; } /** * \brief Determines whether or not the player's location has been set. * * @return True if the player's location is set, false otherwise. */ inline bool hasLocation() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.contains(getAddressSettingName()); } /** * \brief Determines whether or not the player has a password. * * @return True if the player has a password, false otherwise. */ inline bool hasPlayerPassword() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getHasPlayerPasswordSettingName(), false).toBool(); } /** * \brief Retrieves a string describing the location of the player. * * @return A string describing the locaiton of the player. */ inline QString getLocationString() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getAddressSettingName()).toString() + " " + settings.value(getCitySettingName()).toString() + " " + settings.value(getStateSettingName()).toString() + ", " + settings.value(getZipCodeSettingName()).toString(); } /** * \brief Gets the set location street address. If no location is currently set, * an empty string is returned. * * \return The set location street address or an empty string if no address is set. */ inline QString getLocationStreetAddress() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getAddressSettingName()).toString(); } /** * \brief Gets the set location city. If no location is currently set, * an empty string is returned. * * \return The set location city or an empty string if no address is set. */ inline QString getLocationCity() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getCitySettingName()).toString(); } /** * \brief Gets the set location state. If no location is currently set, * an empty string is returned. * * \return The set location state or an empty string if no address is set. */ inline QString getLocationState() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getStateSettingName()).toString(); } /** * \brief Gets the set location zipcode. If no zipcode is currently set, * 0 is returned. * * \return The set location zipcode or 0 if no address is set. */ inline int getLocationZipcode() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getZipCodeSettingName()).toInt(); } /** * \brief Retrieves the next song should be played but does not * remove it from the active playlist. * * @return The next song that is going to be played. */ Phonon::MediaSource getNextSongToPlay(); /** * \brief Retrieves the next song that should be played and removes it * from the active playlist. * * @return The next song that should be played. */ song_info_t takeNextSongToPlay(); /** * \brief Retrieves the state of the player. * * @return The state of the player. */ const QString getPlayerState() const{ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getPlayerStateSettingName()).toString(); } /** * \brief Determines whether or not this player has a player id. * * \return True if the player has an id, false otherwise. */ static bool hasPlayerId(){ QSettings settings( QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return -1 != settings.value(getPlayerIdSettingName(), -1); } /** * \brief Saves the given password to persistent storage in a "secure" manner. * * @param password The password to save. */ static void savePassword(const QString& password); /** * \brief Marks the current saved credentials as invalid. */ static void setPasswordDirty(); /** * \brief Determines whether or not the currently saved password is valid. * * @return True if the currently saved password is valid, false otherwise. */ static bool hasValidSavedPassword(); /** * \brief Retrieves the currently saved password. * * @return The saved password. */ static QString getSavedPassword(); /** * \brief Deletes all the saved credentials. */ static void clearSavedPassword(); /** * \brief Saves the given username to persistent storage * * \param username Username to save to presistent storage. */ static void saveUsername(const QString& username); /** * \brief Retrieves the last username that was saved to presistent storage. * * \return The last username that was saved to persistent storage. */ static QString getSavedUsername(); static bool getDontShowPlaybackErrorSetting(); static void setDontShowPlaybackError(bool checked); //@} /** @name Public Constants */ //@{ /** * \brief When a song title can't be found, this title should be used instead. * * @return The song title to be used when no title is known. */ static const QString& unknownSongTitle(){ static const QString unknownSongTitle = tr("Unknown"); return unknownSongTitle; } /** * \brief When a song artist can't be found, this artist should be used instead. * * @return The song artist to be used when no artist is known. */ static const QString& unknownSongArtist(){ static const QString unknownSongArtist = tr("Unknown"); return unknownSongArtist; } /** * \brief When a song album can't be found, this album should be used instead. * * @return The song album to be used when no album is known. */ static const QString& unknownSongAlbum(){ static const QString unknownSongAlbum = tr("Unknown"); return unknownSongAlbum; } /** * \brief When a song genre can't be found, this genre should be used instead. * * @return The song genre to be used when no genre is known. */ static const QString& unknownGenre(){ static const QString unknownGenre = tr("Unknown"); return unknownGenre; } /** * \brief Gets the name of the table in the playerdb that contains information * about the music library. * * @return The name of the table in the playerdb that contains information * about the music library. */ static const QString& getLibraryTableName(){ static const QString libraryTableName = "library"; return libraryTableName; } /** * \brief Gets name of the table storing the active playlist. * * @return The name of the table containing the active playlist. */ static const QString& getActivePlaylistTableName(){ static const QString activePlaylistTableName = "active_playlist"; return activePlaylistTableName; } /** * \brief Gets name of the view containing the active playlist joined with * the library table. * * @return The view containing the active playlist joined with the library * table. */ static const QString& getActivePlaylistViewName(){ static const QString activePlaylistViewName = "active_playlist_view"; return activePlaylistViewName; } /** * \brief Gets the name of the id column in the active playlist table. * * @return The name of the id column in the active playlist table. */ static const QString& getActivePlaylistIdColName(){ static const QString activePlaylistIdColName = "id"; return activePlaylistIdColName; } /** * \brief Gets the name of the library id column (the column that specifies * which library entry this playlist entry corresponds with) in the active * playlist table. * * @return The name of the library id column in the active playlist table. */ static const QString& getActivePlaylistLibIdColName(){ static const QString activePlaylistLibIdColName = "lib_id"; return activePlaylistLibIdColName; } /** * \brief Gets the name of the column in the active playlist view that * contains the vote count. * * @return The name of the column in the active playlist view that * contains the vote count. */ static const QString& getVoteCountColName(){ static const QString voteCountColName = "vote_count"; return voteCountColName; } /** * \brief Gets the name of the time added column in the active playlist table. * * @return The name of the time added column in the active playlist table. */ static const QString& getTimeAddedColName(){ static const QString timeAddedColName = "time_added"; return timeAddedColName; } /** * \brief Gets the name of the priority column in the active playlist table. * * @return The name of the priority column in the active playlist table. */ static const QString& getPriorityColName(){ static const QString priorityColName = "priority"; return priorityColName; } /** * \brief Gets the name of the adder id column in the active playlist table. * * @return The name of the adder id column in the active playlist table. */ static const QString& getAdderIdColName(){ static const QString adderIdColName = "adderId"; return adderIdColName; } /** * \brief Gets the name of the adder username column in the active playlist table. * * @return The name of the adder username column in the active playlist table. */ static const QString& getAdderUsernameColName(){ static const QString adderUsernameColName = "adder_username"; return adderUsernameColName; } /** * \brief Gets the name of the upvote column in the active playlist table. * * @return The name of the upvote column in the active playlist table. */ static const QString& getUpVoteColName(){ static const QString upVoteColName = "up_votes"; return upVoteColName; } /** * \brief Gets the name of the downvote column in the active playlist table. * * @return The name of the downvote column in the active playlist table. */ static const QString& getDownVoteColName(){ static const QString downVoteColName = "down_votes"; return downVoteColName; } /** * \brief Gets the id column in the library table table. * * @return The name of the id column in the library table. */ static const QString& getLibIdColName(){ static const QString libIdColName = "id"; return libIdColName; } /** * \brief Gets the song column in the library table table. * * @return The name of the song column in the library table. */ static const QString& getLibSongColName(){ static const QString libSongColName = "Song"; return libSongColName; } /** * \brief Gets the artist column in the library table table. * * @return The name of the artist column in the library table. */ static const QString& getLibArtistColName(){ static const QString libArtistColName = "Artist"; return libArtistColName; } /** * \brief Gets the album column in the library table table. * * @return The name of the album column in the library table. */ static const QString& getLibAlbumColName(){ static const QString libAlbumColName = "Album"; return libAlbumColName; } /** * \brief Gets the file column in the library table table. * * @return The name of the file column in the library table. */ static const QString& getLibFileColName(){ static const QString libFileColName = "File"; return libFileColName; } /** * \brief Gets the duration column in the library table table. * * @return The name of the duration column in the library table. */ static const QString& getLibDurationColName(){ static const QString libDurationColName = "Length"; return libDurationColName; } /** * \brief Gets the genre column in the library table table. * * @return The name of the genre column in the library table. */ static const QString& getLibGenreColName(){ static const QString libGenreColName = "Genre"; return libGenreColName; } /** * \brief Gets the track column in the library table table. * * @return The name of the track column in the library table. */ static const QString& getLibTrackColName(){ static const QString libTrackColName = "Track"; return libTrackColName; } /** * \brief Gets the is deleted column in the library table table. * * @return The name of the is deleted column in the library table. */ static const QString& getLibIsDeletedColName(){ static const QString libIsDeletedColName = "is_deleted"; return libIsDeletedColName; } /** * \brief Gets the is banned column in the library table table. * * @return The name of the is banned column in the library table. */ static const QString& getLibIsBannedColName(){ static const QString libIsBannedColName = "is_banned"; return libIsBannedColName; } /** * \brief Gets the sycn status column in the library table table. * * @return The name of the sycn status column in the library table. */ static const QString& getLibSyncStatusColName(){ static const QString libSyncStatusColName = "sync_status"; return libSyncStatusColName; } /** * \brief Gets the value for the "needs add" sync status used in the library * table. * * @return The value for the "needs add" sync status used in the library * table. */ static const lib_sync_status_t& getLibNeedsAddSyncStatus(){ static const lib_sync_status_t libNeedsAddSyncStatus = 1; return libNeedsAddSyncStatus; } /** * \brief Gets the value for the "needs delete" sync status used in the * library table. * * @return The value for the "needs delete" sync status used in the library * table. */ static const lib_sync_status_t& getLibNeedsDeleteSyncStatus(){ static const lib_sync_status_t libNeedsDeleteSyncStatus = 2; return libNeedsDeleteSyncStatus; } /** * \brief Gets the value for the "needs ban" sync status used in the * library table. * * @return The value for the "needs ban" sync status used in the library * table. */ static const lib_sync_status_t& getLibNeedsBanSyncStatus(){ static const lib_sync_status_t libNeedsBanStatus = 3; return libNeedsBanStatus; } /** * \brief Gets the value for the "is synced" sync status used in the library * table. * * @return The value for the "is synced" sync status used in the library * table. */ static const lib_sync_status_t& getLibIsSyncedStatus(){ static const lib_sync_status_t libIsSyncedStatus = 0; return libIsSyncedStatus; } /** * \brief Gets the name of the LibIdAlias column for the playlist view. * * @return The name of the LibIdAlias column for the playlist view. */ static const QString& getLibIdAlias(){ static const QString libIdAlias = "libIdAlias"; return libIdAlias; } /** * \brief Gets the name of the player id setting. * * @return The name of the player id setting. */ static const QString& getPlayerIdSettingName(){ static const QString playerIdSetting = "playerId"; return playerIdSetting; } /** * \brief Gets the name of the player volume setting. * * @return The name of the player volume setting. */ static const QString& getPlayerVolumeSettingName(){ static const QString playerVolumeSettingName = "volume"; return playerVolumeSettingName; } /** * \brief Gets the name of the player name setting. * * @return The name of the player name setting. */ static const QString& getPlayerNameSettingName(){ static const QString playerIdSetting = "playerName"; return playerIdSetting; } /** * \brief Gets the name of the player state setting. * * @return The name of the player state setting. */ static const QString& getPlayerStateSettingName(){ static const QString playerStateSettingName = "playerState"; return playerStateSettingName; } /** * \brief Name of the setting used to store whether or not the player has a password. * * @return Name of the setting used to store whether or not the player has a password. */ static const QString& getHasPlayerPasswordSettingName(){ static const QString hasPlayerPasswordSettingName = "hasPlayerPassword"; return hasPlayerPasswordSettingName; } /** * \brief Gets the name of the player address setting. * * @return The name of the player address setting. */ static const QString& getAddressSettingName(){ static const QString addressSettingName = "address"; return addressSettingName; } /** * \brief Gets the name of the player city setting. * * @return The name of the player city setting. */ static const QString& getCitySettingName(){ static const QString citySettingName = "city"; return citySettingName; } /** * \brief Gets the name of the player state setting. * * @return The name of the player state setting. */ static const QString& getStateSettingName(){ static const QString stateSettingName = "state"; return stateSettingName; } /** * \brief Gets the name of the player zip code setting. * * @return The name of the player zip code setting. */ static const QString& getZipCodeSettingName(){ static const QString zipCodeSettingName = "zipCode"; return zipCodeSettingName; } /** * \brief Gets the value corresponding to an playling player state. * * @return The value corresponding to an playling player state. */ static const QString& getPlayingState(){ static const QString playingState = "playing"; return playingState; } /** * \brief Gets the value corresponding to an inactive player state. * * @return The value corresponding to an inactive player state. */ static const QString& getPausedState(){ static const QString pausedState = "paused"; return pausedState; } /** * \brief Gets the value corresponding to an inactive player state. * * @return The value corresponding to an inactive player state. */ static const QString& getInactiveState(){ static const QString inactiveState = "inactive"; return inactiveState; } /** * \brief Gets the value used for the Settings Organization. * * @return The value of the settings organization. */ static const QString& getSettingsOrg(){ static const QString settingsOrg = "Bazaar Solutions"; return settingsOrg; } /** * \brief Gets the value used for the Settings App. * * @return The value of the settings app. */ static const QString& getSettingsApp(){ static const QString settingsApp = "UDJ"; return settingsApp; } static const QString& getDontShowPlaybackErrorSettingName(){ static const QString dontShowPlaybackErrorSettingName = "dontshowplaybackerror"; return dontShowPlaybackErrorSettingName; } //@} /** @name Public slots */ //@{ public slots: /** * \brief Starts the datastore automatically refreshing the playlist. */ void startPlaylistAutoRefresh(); /** * \brief Starts the datastore automatically refreshing the list of participants. */ void startParticipantsAutoRefresh(); /** * \brief Syncs the current state of the library with the server. */ void syncLibrary(); /** * \brief Pauses player. */ void pausePlayer(); /** * \brief Start player playing. */ void playPlayer(); /** * \brief Refresh the active playlist table. */ void refreshActivePlaylist(); /** \brief Refresh the participants list. */ void refreshParticipantList(); /** * \brief Adds the given song to the active playlist. * * @param libraryId The song to add to the active playlist. */ void addSongToActivePlaylist(library_song_id_t libraryId); /** * \brief Adds the given songs to the active playlist. * * @param libIds The songs to add to the active playlist. */ void addSongsToActivePlaylist(const QSet& libIds); /** * \brief Removes the given songs to the active playlist. * * @param libraryIds The songs to remove to the active playlist. */ void removeSongsFromActivePlaylist(const QSet& libraryIds); /** * \brief Creates a new player with the given name and password. * * @param name The name of the player. * @param password The password for the event (is allowed to be empty, thus setting no password). */ void createNewPlayer( const QString& name, const QString& password); /** * \brief Creates a new player with the given name, password, and location. * * @param name The name of the player. * @param password The password for the event (is allowed to be empty, thus setting no password). * @param streetAddress The street address of the player. * @param city The city of the player. * @param state The state of the player. * @param zipcode The zipcode of the player. */ void createNewPlayer( const QString& name, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode); /** * \brief Sets the current song to the speicified song. * * @param songToPlay The playlist id of the song to be played. */ void setCurrentSong(const library_song_id_t& songToPlay); /** * \brief Sets the volume for the player. * * @param newVolume The new player volume. */ void setVolume(qreal newVolume); /** \brief Determines whether or not the library has unsynced songs.*/ bool hasUnsyncedSongs() const; /** \brief Determines the number of unsynced songs in the library.*/ int getTotalUnsynced() const; //@} signals: /** @name Signals */ //@{ /** * \brief Emitted when the given user credentials do not work with the server. */ void hardAuthFailure(); /** * \brief Emitted when the player state was succesfully changed to inactive. */ void playerSuccessfullySetInactive(); /** * \brief Emitted when there was an error setting the player inactive. * * @param errMessage A message descibing the error. */ void playerSetInactiveError(const QString& errMessage); /** * \brief Emitted when there was an error setting the player to "playing". * * @param errMessage A message descibing the error. */ void playPlayerError(const QString& errMessage); /** * \brief Emitted when there was an error setting the player to "paused". * * @param errMessage A message descibing the error. */ void pausePlayerError(const QString& errMessage); /** * \brief Emitted when the player's password has been removed by a component of this client. */ void playerPasswordRemoved(); /** * \brief Emitted when there is an error removing the player's password. * * \param errMessage An error message describing what happened. */ void playerPasswordRemoveError(const QString& errMessage); /** * \brief Emitted when the player's password is set by a compenent of this client. */ void playerPasswordSet(); /** * \brief Emitter when there is an error setting the player's password. * * \param errMessage A message describing the error. */ void playerPasswordSetError(const QString& errMessage); /** * \brief Emitted when the player's location is set by a component of this client. */ void playerLocationSet(); /** * \brief Emitted when there is an error setting the player's location. * * \brief errMessage Message describing the error. */ void playerLocationSetError(const QString& errMessage); /** * \brief Emitted when the library table is modified. */ void libSongsModified(const QSet& modifiedSongs); /** * \brief Emitted when there was an error modifying the library. * * @param errMessage An error message describing what happened. */ void libModError(const QString& errMessage); /** * \brief Emitted when the library is completely synced with the server. */ void allSynced(); /** * \brief Emitted when a player is created. */ void playerCreated(); /** * \brief Emitted when the creation of a player fails. * * @param errMessage Error message describing what happened. */ void playerCreationFailed(const QString errMessage); /** * \brief Emitted when the active playlist is modified by the server. */ void activePlaylistModified(); /** * \brief Emitted when the participant list retrieved from server. */ void newParticipantList(const QVariantList& newParticipants); /** * \brief Emitted when the current song is manually changed. * * @param newSong The song that should be set as the current song. */ void manualSongChange(DataStore::song_info_t newSong); /** * \brief Emitted when the players state is changed by the server. * * \param newState The new state of the player. */ void playerStateChanged(const QString& newState); /** * \brief Emitted when the volume of the player is changed by the server. * * @param newVolume The new volume of the player. */ void volumeChanged(qreal newVolume); /** * \brief Emitted when changing the volume on the server failed. * * @param errMessage A message describing the error. */ void setVolumeError(const QString& errMessage); /** * \brief Emitted when clearing the current song on ther server failed. * * @param errMessage A message describing the error. */ void clearCurrentSongError(const QString& errMessage); //@} private: /** @name Private Members */ //@{ /** \brief Connection to the UDJ server */ UDJServerConnection *serverConnection; /** \brief Actual database connection */ QSqlDatabase database; /** \brief Timer used to refresh the active playlist. */ QTimer *activePlaylistRefreshTimer; /** \brief Timer used to refresh the list of participants. */ QTimer *participantRefreshTimer; /** \brief Current username being used by the client */ QString username; /** \brief Current password being used by the client */ QString password; /** \brief A set of actions to be performed once the client has succesfully reauthenticated. */ QSet reauthActions; /** * \brief If there is an auth error during the setting of a player password, this is the password that * should be set on the player after the reauth is complete. */ QString reauthPlayerPassword; /** \brief Whether or not the client is currently reauthenticating. */ bool isReauthing; /** * \brief Whether or not the client is currently setting the player's playback state. * * This is used to help us ignore playback states that are different from our own while * we're in the process of changing the playback state. */ bool changingPlayerState; /** * \brief Whether or not the client is currently setting the current song as cleared. * * This is used to help us ignore current song changes while we're clearing the current * song. */ bool clearingCurrentSong; /** \brief The current song being played. */ library_song_id_t currentSongId; /** \brief The set of songs that still need to be added to the active playlist. */ QSet playlistIdsToAdd; /** \brief The set of songs that still need to be removed from the active playlist. */ QSet playlistIdsToRemove; //@} /** @name Private Functions */ //@{ /** \brief Does initial database setup */ void setupDB(); /** * \brief Set player state. * * \param State to which the player should be set. */ void setPlayerState(const QString& newState); /** * \brief Deletes a single song from the active playlist. * * \param toDelete The library id of the song to delete from the playlist. */ void deleteSongFromPlaylist(library_song_id_t toDelete); /** * \brief Deletes all the entries in the active playlist table. */ void clearActivePlaylist(); /** * \brief Initiates reauthentication if it hasn't already been initiated. */ void initReauth(); /** * \brief Performs the specified ReauthAction. * * @param action The ReauthAction to preform. */ void doReauthAction(const ReauthAction& action); /** * \brief Adds a single song to the music library. * * @param song Song to be added to the library. * @param addQuery Prepared statmemnt ready to be used for adding */ void addSongToLibrary(const Phonon::MediaSource& song, QSqlQuery& addQuery); /** * \brief Gets the value of a header. * * @param headerName The name of the desired header. * @param headers The given headers. * @return The value of the header. If the header is not located in the given headers a blank * string is returned. */ static QByteArray getHeaderValue( const QByteArray& headerName, const QList& headers); /** * \brief Determines whether or not an error is a ticket auth error. * * \param errorCode The given error code from the server. * \param headers The given headers from the server. * \return True if the error is a ticket auth error, false otherwise. */ static inline bool isTicketAuthError( int errorCode, const QList& headers) { return errorCode==401 && getHeaderValue("WWW-Authenticate", headers) == "ticket-hash"; } //@} /** @name Private Constants */ //@{ /** * \brief Retrieves the name of the connection to the playerdb. * * @return The name of the connection to the playerdb. */ static const QString& getPlayerDBConnectionName(){ static const QString playerDBConnectionName("playerdbConn"); return playerDBConnectionName; } /** * \brief Retrieves the name of the player database. * * @return The name of the the player database. */ static const QString& getPlayerDBName(){ static const QString playerDBName("playerdb"); return playerDBName; } /** * \brief Gets the query used to create the library table. * * @return The query used to create the library table. */ static const QString& getCreateLibraryQuery(){ static const QString createLibQuery = "CREATE TABLE IF NOT EXISTS " + getLibraryTableName() + "(" + getLibIdColName() + " INTEGER PRIMARY KEY AUTOINCREMENT, " + getLibSongColName() + " TEXT NOT NULL, " + getLibArtistColName() + " TEXT NOT NULL, "+ getLibAlbumColName() + " TEXT NOT NULL, " + getLibGenreColName() + " TEXT NOT NULL, " + getLibTrackColName() + " INTEGER NOT NULL, " + getLibFileColName() + " TEXT NOT NULL, " + getLibDurationColName() + " INTEGER NOT NULL, " + getLibIsDeletedColName() + " INTEGER DEFAULT 0, " + getLibIsBannedColName() + " INTEGER DEFAULT 0, " + getLibSyncStatusColName() + " INTEGER DEFAULT " + QString::number(getLibNeedsAddSyncStatus()) + " " + "CHECK("+ getLibSyncStatusColName()+"="+ QString::number(getLibIsSyncedStatus()) +" OR " + getLibSyncStatusColName()+"="+ QString::number(getLibNeedsAddSyncStatus()) +" OR " + getLibSyncStatusColName()+"="+ QString::number(getLibNeedsDeleteSyncStatus()) +" OR " + getLibSyncStatusColName()+"="+ QString::number(getLibNeedsBanSyncStatus()) + "));"; return createLibQuery; } /** * \brief Gets the query used to create the active playlist table. * * @return The query used to create the active playlist table. */ static const QString& getCreateActivePlaylistQuery(){ static const QString createActivePlaylistQuery = "CREATE TABLE IF NOT EXISTS " + getActivePlaylistTableName() + "(" + getActivePlaylistIdColName() + " INTEGER PRIMARY KEY, " + getActivePlaylistLibIdColName() + " INTEGER REFERENCES " + getLibraryTableName() +"(" + getLibIdColName()+ ") ON DELETE CASCADE, "+ getDownVoteColName() + " INTEGER NOT NULL, " + getUpVoteColName() + " INTEGER NOT NULL, " + getPriorityColName() + " INTEGER NOT NULL, " + getAdderIdColName() + " INTEGER NOT NULL, " + getAdderUsernameColName() + " TEXT NOT NULL, " + getTimeAddedColName() + " TEXT DEFAULT CURRENT_TIMESTAMP);"; return createActivePlaylistQuery; } /** * \brief Gets the query used to create the active playlist view ( * a join between the active playlist and the library table). * * @return The query used to create the active playlist view. */ static const QString& getCreateActivePlaylistViewQuery(){ static const QString createActivePlaylistViewQuery = "CREATE VIEW IF NOT EXISTS "+getActivePlaylistViewName() + " " + "AS SELECT " + getActivePlaylistTableName() + "." + getActivePlaylistIdColName() + "," + getActivePlaylistTableName() + "." + getActivePlaylistLibIdColName() + "," + getLibraryTableName() + "." + getLibSongColName() + "," + getLibraryTableName() + "." + getLibFileColName() + "," + getLibraryTableName() + "." + getLibArtistColName() + "," + getLibraryTableName() + "." + getLibAlbumColName() + "," + getActivePlaylistTableName() + "." + getUpVoteColName() + "," + getActivePlaylistTableName() + "." + getDownVoteColName() + "," + getLibraryTableName() + "." + getLibDurationColName() + "," + getActivePlaylistTableName() + "." + getAdderIdColName() + "," + getActivePlaylistTableName() + "." + getAdderUsernameColName() + "," + getActivePlaylistTableName() + "." + getTimeAddedColName() + "," + getLibraryTableName() + "." + getLibIdColName() + " AS " + getLibIdAlias() + " " + "FROM " + getActivePlaylistTableName() + " INNER JOIN " + getLibraryTableName() + " ON " + getActivePlaylistTableName() + "." + getActivePlaylistLibIdColName() + "=" + getLibraryTableName() + "." + getLibIdColName() +" " "ORDER BY " +getPriorityColName() + " ASC;"; return createActivePlaylistViewQuery; } /** * \brief Gets the query used to delete all entries in the active playlist * table. * * @return The query used to delete all entries in the active playlist * table. */ static const QString& getClearActivePlaylistQuery(){ static const QString clearActivePlaylistQuery = "DELETE FROM " + getActivePlaylistTableName() + ";"; return clearActivePlaylistQuery; } /** * \brief Name of the setting used to store the username being used by the client. * * @return Name of the setting used to store the username being used by the client. */ static const QString& getUsernameSettingName(){ static const QString usernameSettingName = "username"; return usernameSettingName; } /** * \brief Name of the setting used to store the password being used by the client. * * @return Name of the setting used to store the password being used by the client. */ static const QString& getPasswordSettingName(){ static const QString passwordSettingName = "password"; return passwordSettingName; } /** * \brief Name of the setting used to store whether or not the current credentials are valid. * * @return Name of the setting used to store whether or not the current credentials are valid. */ static const QString& getHasValidSavedPasswordSettingName(){ static const QString hasValidSavedPasswordSettingName = "has_valid_password"; return hasValidSavedPasswordSettingName; } //@} /** @name Private Slots */ //@{ private slots: /** * \brief Performs appropriate tasks when the player's state has been succesfully changed on the * server. * * \param state The state the player was changed to on the server. */ void onPlayerStateSet(const QString& state); /** * \brief Performs appropriate tasks when the player's state has been succesfully changed on the * server. * * \param state The state which was attempted to be set on the player. * \param errMessage A message describing the error. * \param errorCode HTTP error code describing error. * \param headers HTTP headers accompianing in the error response. */ void onPlayerStateSetError( const QString& state, const QString& errMessage, int errorCode, const QList& headers); /** * \brief Performs appropriate tasks when the current song has been succesfully cleared. */ void onCurrentSongCleared(); /** * \brief Preforms appropriate tasks when there was an error clearing the current song. * * \param errMessage A message describing the error. * \param errorCode HTTP error code describing error. * \param headers HTTP headers accompianing in the error response. */ void onCurrentSongClearError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Preforms appropriate tasks when there was an error removing the player's password. * * \param errMessage A message describing the error. * \param errorCode HTTP error code describing error. * \param headers HTTP headers accompianing in the error response. */ void onPlayerPasswordRemoveError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Preforms appropriate tasks when there was an error setting the player's location. * * \param attemptedPassword The password that was attempted to be set on the server. * \param errMessage A message describing the error. * \param errorCode HTTP error code describing error. * \param headers HTTP headers accompianing in the error response. */ void onPlayerPasswordSetError( const QString& attemptedPassword, const QString& errMessage, int errorCode, const QList& headers); /** * \brief Preforms appropriate tasks when there was an error setting the player's location. * * \param errMessage A message describing the error. * \param errorCode HTTP error code describing error. * \param headers HTTP headers accompianing in the error response. */ void onPlayerLocationSetError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Sets the sync status of a library song to synced. * * @param song The id of the song whose sync status should be set to synced. */ void setLibSongSynced(library_song_id_t song); /** * \brief Sets the sync status of the given library songs to synced. * * @param songs The ids of the songs whose sync status should be set * to synced. */ void setLibSongsSynced(const QSet& songs); /** * \brief Sets the sync status of the given library songs to the given * given sync status. * * @param songs The ids of the songs whose sync status should be set. * @param syncStatus The sync status to which the given songs should be set. */ void setLibSongsSyncStatus( const QSet& songs, const lib_sync_status_t syncStatus); /** * \brief Adds the given song to the active playlist in the database. * * @param songToAdd A QVariantMap representing the song that should be added to the active * playlist in the database. * @param priority The priority of the song to be added. */ void addSong2ActivePlaylistFromQVariant(const QVariantMap &songToAdd, int priority); /** * \brief Sets the active playlist to the given playlist. * * @param newPlaylist The new playlist to be set in the database. */ void setActivePlaylist(const QVariantMap& playlist); /** * \brief Takes appropriate action when retreiving the active playlist fails. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void onGetActivePlaylistFail( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Takes the appropriate action when a player is succesfully created. * * @param issuedId The id the server issued to the player that was created. */ void onPlayerCreate(const player_id_t& issuedId); /** * \brief Takes appropriate action when creating a player fails. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void onPlayerCreationFailed(const QString& errMessage, int errorCode, const QList& headers); /** * \brief Takes appropriate action when modifiying the library on the server fails. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void onLibModError( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Takes appropriate action when retreiving setting the current song on the server fails. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void onSetCurrentSongFailed( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Takes appropriate action when the client succesfully reauthenticates. * * \param ticketHash The ticket hash that was recieved from the server. * \param userId The userId that was recieved from the server. */ void onReauth(const QByteArray& ticketHash, const user_id_t& userId); /** * \brief Takes appropriate action when reauthentication fails. * * \param errMessage Error message given by the server. */ void onAuthFail(const QString& errMessage); /** * \brief Takes appropriate action when the active playlist is succesfully modified on the server. * * \param added The songs that were added to the active playlist on the server. * \param removed The songs that were removed from the active playlist on the server. */ void onActivePlaylistModified( const QSet& added, const QSet& removed); /** * \brief Takes appropriate action when modifiying the active playlist on the server fails. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void onActivePlaylistModFailed( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Takes appropriate action when setting the volume fails. * * @param errMessage A message describing the error. * @param errorCode The http status code that describes the error. * @param headers The headers from the http response that indicated a failure. */ void onSetVolumeFailed( const QString& errMessage, int errorCode, const QList& headers); /** * \brief Takes appropriate action when the particpants list is retrieved from the server. * * \param newParticipants The new list of participants. */ void onNewParticipantList(const QVariantList& newParticipants); //@} //@} }; } //end namespace #endif //DATA_STORE_HPP UDJ-Desktop-Client-0.6.4/src/LoginWidget.hpp0000664000175000017500000000654212051252546020141 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef LOGIN_WIDGET_HPP #define LOGIN_WIDGET_HPP #include "WidgetWithLoader.hpp" #include "ConfigDefs.hpp" class QLabel; class QLineEdit; class QCheckBox; namespace UDJ{ class UDJServerConnection; /** \brief Widget used to login to the UDJ server */ class LoginWidget : public WidgetWithLoader{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a Login Widget * * \param parent Parent Widget. */ LoginWidget(QWidget *parent=0); //@} public slots: /** @name Public slots */ //@{ /** \brief Perform actions necessary for loggin in */ void doLogin(); //@} signals: /** * \brief Emitted once the main gui is started. */ void startedMainGUI(); /** * \brief Emitted when logging in fails. */ void loginFailed(); private: /** @name Private Memeber */ //@{ /** \brief Label used for displayling the UDJ logo. */ QLabel *logo; /** \brief Lineedit used for entering the user name */ QLineEdit *usernameBox; /** \brief lineedit used for entering the password. */ QLineEdit *passwordBox; /** \brief Checkbox for indicating whether or not password should be saved. */ QCheckBox *savePassword; /** \brief Label giving registration information. */ QLabel *registerText; /** \brief Label giving forgotten password information. */ QLabel *forgotPasswordText; /** \brief Actual display for the login widget. */ QWidget *loginDisplay; /** \brief Connection to the server. */ UDJServerConnection *serverConnection; /** \brief Username label */ QLabel *usernameLabel; /** \brief Password label */ QLabel *passwordLabel; //@} /** @name Private Functions */ //@{ /** \brief Initializes UI. */ void setupUi(); //@} private slots: /** @name Private Slots */ //@{ /** * \brief Once the user has succesfully authenitcated, this starts up the * main gui for udj. * * \param ticketHash Ticket hash recieved from the server upon succesfully authentication. * \param userId User id recieved from the server upon succesfully authentication. */ void startMainGUI(const QByteArray& ticketHash, const user_id_t& userId); /** * \brief Displays a message informing the user that the attempt to login to * the UDJ server failed. * * @param errorMessage The error message describing the failure. */ void displayLoginFailedMessage(const QString errorMessage); /** * \brief Takes appropriate action when the user clicks on the savePassword check box. * * \param newSetting The current state of the save password check box. */ void savePasswordChanged(bool newSetting); //@} }; } //end namespace UDJ #endif //LOGIN_WIDGET_HPP UDJ-Desktop-Client-0.6.4/src/mac/0000775000175000017500000000000012051252546015745 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/src/mac/UDJApp_Mac.h0000664000175000017500000000143212051252546017761 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef UDJAPP_MAC_H #define UDJAPP_MAC_H void macMain(); void checkForUdpates(); #endif UDJ-Desktop-Client-0.6.4/src/mac/UDJApp_Mac.mm0000664000175000017500000000167612051252546020155 0ustar kurtiskurtis#include "UDJApp_Mac.h" #import #import #import #import #import #import #import #import #import #import #import #import #import #include #include #include #include void macMain() { [[NSAutoreleasePool alloc] init]; // Creates and sets the magic global variable so QApplication will find it. //[MacApplication sharedApplication]; [NSApplication sharedApplication]; // Creates and sets the magic global variable for Sparkle. [[SUUpdater sharedUpdater] setDelegate: NSApp]; } void checkForUpdates() { [[SUUpdater sharedUpdater] checkForUpdates: NSApp]; } UDJ-Desktop-Client-0.6.4/src/attic/0000775000175000017500000000000012051252546016311 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/src/attic/SettingsWidget.hpp0000664000175000017500000000270712051252546021774 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef SETTINGS_WIDGET_HPP #define SETTINGS_WIDGET_HPP #include class QCheckBox; namespace UDJ{ /** * \brief Widget used to view and adjust UDJ settings */ class SettingsWidget : public QWidget{ Q_OBJECT public: /** @name Constructor(s) */ //@{ /** * \brief Constructs a SettingsWidget * * @param parent The parent widget. */ SettingsWidget(QWidget* parent=0); //@} private: /** @name Private Members */ //@{ /** * \brief Checkbox indicating whether or not file uploads should be allowed. */ QCheckBox* allowFileUploads; //@} /** @name Private Functions */ //@{ /** \brief Sets up all the UI components that make up the widget. */ void setupUi(); //@} }; } //end namespace #endif //SETTINGS_WIDGET_HPP UDJ-Desktop-Client-0.6.4/src/attic/SettingsWidget.cpp0000664000175000017500000000226212051252546021763 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "SettingsWidget.hpp" #include #include namespace UDJ{ SettingsWidget::SettingsWidget(QWidget* parent):QWidget(parent){ setupUi(); } void SettingsWidget::setupUi(){ allowFileUploads = new QCheckBox(tr("Allow song uploads"), this); allowFileUploads->setToolTip(tr("Allow users to upload songs. Could be dangerous!")); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(allowFileUploads); setLayout(mainLayout); } } //end namespace UDJ-Desktop-Client-0.6.4/src/attic/DifferenceSpinner.hpp0000664000175000017500000000421412051252546022414 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef DIFFERENCE_SPINNER_HPP #define DIFFERENCE_SPINNER_HPP #include "ConfigDefs.hpp" #include namespace UDJ{ /** * \brief A DifferenceSpinner is a special impelmentation of a QSpinBox * that remembers a specific past value and can then calculate * the difference of the current value from that last saved value. */ class DifferenceSpinner : public QSpinBox{ Q_OBJECT public: /** @name Constructors */ //@{ /** \brief Constructs a DifferenceSpinner * * @param parent The parent widget of this DifferenceSpinner. */ DifferenceSpinner(QWidget* parent=0): QSpinBox(parent), savedValue(-1){} //@} /** @name Getters and Setters */ //@{ /** \brief Saves the current value of the spinner. * This way the spinners current value can be compared to * a previous value. */ inline void saveCurrentValue(){ savedValue = value(); } /** \brief Retrieves the last saved value. * * @return The last saved value. */ inline int getSavedValue(){ return savedValue; } /** * \brief retrieves the difference between the saved value and the current * value. * * @return The difference between the saved value and the current value. */ inline int getCurrentValueSavedValueDiff(){ return value()-getSavedValue(); } //@} private: /** @name Private Members */ //@{ /** \brief Saved value used for future comparison. */ int savedValue; //@} }; } //end namespace #endif //DIFFERENCE_SPINNER_HPP UDJ-Desktop-Client-0.6.4/src/attic/README0000664000175000017500000000021312051252546017165 0ustar kurtiskurtisThis is code that I created at one point, is no longer used, but I still don't want to get rid of. It could come in handy in a little bit. UDJ-Desktop-Client-0.6.4/src/JSONHelper.cpp0000664000175000017500000001457512051252546017636 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include #include "JSONHelper.hpp" #include "qt-json/json.h" #include #include namespace UDJ{ QByteArray JSONHelper::getJSONForLibAdd(const QVariantList& songsToAdd){ bool success; return getJSONForLibAdd(songsToAdd, success); } QByteArray JSONHelper::getJSONForLibAdd(const QVariantList& songsToAdd, bool &success){ return QtJson::Json::serialize(songsToAdd,success); } QByteArray JSONHelper::getJSONForLibDelete(const QVariantList& songsToDelete){ bool success; return getJSONForLibDelete(songsToDelete, success); } QByteArray JSONHelper::getJSONForLibDelete(const QVariantList& songsToDelete, bool &success){ return QtJson::Json::serialize(songsToDelete, success); } QSet JSONHelper::getLibIds(const QByteArray& payload){ QString responseString = QString::fromUtf8(payload); bool success; QVariantList songs = QtJson::Json::parse(responseString, success).toList(); if(!success){ std::cerr << "Error parsing json from a response to an add library entry" << "request" << std::endl << responseString.toStdString() << std::endl; } QSet toReturn; Q_FOREACH(QVariant song, songs){ toReturn.insert(song.toMap()["id"].value()); } return toReturn; } QSet JSONHelper::convertLibIdArray(const QByteArray& payload){ QString responseString = QString::fromUtf8(payload); bool success; QVariantList ids = QtJson::Json::parse(responseString, success).toList(); if(!success){ std::cerr << "Error parsing json from a response to an delete library entry" << "request" << std::endl << responseString.toStdString() << std::endl; } QSet toReturn; Q_FOREACH(QVariant id, ids){ toReturn.insert(id.value()); } return toReturn; } const QByteArray JSONHelper::getCreatePlayerJSON( const QString& playerName, const QString& password) { bool success; return getCreatePlayerJSON(playerName, password, success); } const QByteArray JSONHelper::getCreatePlayerJSON( const QString& playerName, const QString& password, bool &success) { QVariantMap playerToCreate; playerToCreate["name"] = playerName; if(password != ""){ playerToCreate["password"] = password; } return QtJson::Json::serialize(QVariant(playerToCreate),success); } const QByteArray JSONHelper::getCreatePlayerJSON( const QString& playerName, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode) { bool success; return getCreatePlayerJSON(playerName, password, streetAddress, city, state, zipcode, success); } const QByteArray JSONHelper::getCreatePlayerJSON( const QString& playerName, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode, bool &success) { QVariantMap playerToCreate; playerToCreate["name"] = playerName; if(password != ""){ playerToCreate["password"] = password; } QVariantMap location; location["address"] = streetAddress; location["locality"] = city; location["region"] = state; location["postal_code"] = zipcode; location["country"] = "United States"; playerToCreate["location"] = location; return QtJson::Json::serialize(QVariant(playerToCreate),success); } player_id_t JSONHelper::getPlayerId(QNetworkReply *reply){ QByteArray responseData = reply->readAll(); QString responseString = QString::fromUtf8(responseData); bool success; QVariantMap playerCreated = QtJson::Json::parse(responseString, success).toMap(); if(!success){ std::cerr << "Error parsing json from a response to an player creation" << "request" << std::endl << responseString.toStdString() << std::endl; } return playerCreated["id"].value(); } QVariantMap JSONHelper::getActivePlaylistFromJSON(QNetworkReply *reply){ QByteArray responseData = reply->readAll(); QString responseString = QString::fromUtf8(responseData); bool success; QVariantMap activePlaylist = QtJson::Json::parse(responseString, success).toMap(); if(!success){ std::cerr << "Error parsing json from a response to an acitve Playlist request" << "request" << std::endl << responseString.toStdString() << std::endl; } return activePlaylist; } QVariantList JSONHelper::getParticipantListFromJSON(QNetworkReply *reply){ QByteArray responseData = reply->readAll(); QString responseString = QString::fromUtf8(responseData); bool success; QVariantList participantsList = QtJson::Json::parse(responseString, success).toList(); if(!success){ std::cerr << "Error parsing json from a response to an get Participants List request" << std::endl << responseString.toStdString() << std::endl; } return participantsList; } QByteArray JSONHelper::getJSONLibIds(const QSet& libIds){ bool success; QVariantList idList; Q_FOREACH(library_song_id_t libId, libIds){ idList.append(QVariant::fromValue(libId)); } return QtJson::Json::serialize(idList, success); } QSet JSONHelper::extractSongLibIds(const QByteArray& idsString){ bool success; QVariantList libIds = QtJson::Json::parse(idsString, success).toList(); QSet toReturn; Q_FOREACH(QVariant libId, libIds){ toReturn.insert(libId.value()); } return toReturn; } const QVariantMap JSONHelper::getAuthReplyFromJSON(QNetworkReply *reply, bool &success){ QByteArray responseData = reply->readAll(); QString responseString = QString::fromUtf8(responseData); QVariantMap authReply = QtJson::Json::parse(responseString, success).toMap(); return authReply; } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/ActivityList.cpp0000664000175000017500000000416512051252546020347 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "ActivityList.hpp" #include "DataStore.hpp" #include #include #include #include #include #include namespace UDJ{ ActivityList::ActivityList(DataStore *dataStore, QWidget *parent): QTreeView(parent), dataStore(dataStore) { setupUi(); setFocusPolicy(Qt::TabFocus); connect( this, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&))); } void ActivityList::itemClicked(const QModelIndex& index){ if(index == libraryItem->index()){ emit libraryClicked(); } else if(index == playlistItem->index()){ emit playlistClicked(); } else if(index == participantsItem->index()){ emit participantsClicked(); } } void ActivityList::setupUi(){ setSelectionMode(QAbstractItemView::SingleSelection); libraryItem = new QStandardItem(getLibraryTitle()); libraryItem->setEditable(false); playlistItem = new QStandardItem(getPlaylistTitle()); playlistItem->setEditable(false); participantsItem = new QStandardItem(getParticipantsTitle()); participantsItem->setEditable(false); model = new QStandardItemModel(this); model->appendRow(libraryItem); model->appendRow(playlistItem); model->appendRow(participantsItem); setModel(model); header()->hide(); } void ActivityList::switchToLibrary(){ setCurrentIndex(libraryItem->index()); emit libraryClicked(); } }// end namespace UDJ UDJ-Desktop-Client-0.6.4/src/LoginDialog.hpp0000664000175000017500000000310712051252546020107 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef LOGIN_DIALOG_HPP #define LOGIN_DIALOG_HPP #include "DialogWithLoaderWidget.hpp" namespace UDJ{ class LoginWidget; /** \brief Dialog used to login to the UDJ server */ class LoginDialog : public DialogWithLoaderWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a Login Widget * * \brief parent Parent widget. * \brief f Window flags. */ LoginDialog(QWidget *parent=0, Qt::WindowFlags f=0); //@} public slots: /** @name Overridden slots */ //@{ /** \brief . */ virtual void accept(); /** \brief . */ virtual void reject(); //@} private: /** @name Private Memeber */ //@{ /** \brief Widget used for logging in. */ LoginWidget *loginWidget; //@} /** @name Private Functions */ //@{ /** \brief Initializes UI. */ void setupUi(); //@} }; } //end namespace UDJ #endif //LOGIN_DIALOG_HPP UDJ-Desktop-Client-0.6.4/src/Utils.cpp0000664000175000017500000000360312051252546017013 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include #include #include "simpleCrypt/simplecrypt.h" #include "ConfigDefs.hpp" #include #include namespace UDJ{ namespace Utils{ //Yea yea, I Know. Not very cryptographically secure. But honestly, if your machine //has been comprised and someone can get at your key file, you have MUCH bigger problems. SimpleCrypt getCryptoObject(){ QDir keyDir(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); if(!keyDir.exists()){ //TODO handle if this fails keyDir.mkpath(keyDir.absolutePath()); } QString credKeyFilePath = keyDir.absoluteFilePath("credKey"); QFile credKeyFile(credKeyFilePath); if(credKeyFile.exists(credKeyFilePath)){ credKeyFile.open(QIODevice::ReadOnly); QByteArray keyArray = credKeyFile.readAll(); credKeyFile.close(); return SimpleCrypt(keyArray.toULongLong()); } else{ qsrand(QDateTime::currentMSecsSinceEpoch()); quint64 random = qrand(); QByteArray randomArray = QByteArray::number(random); credKeyFile.open(QIODevice::WriteOnly); credKeyFile.write(randomArray); credKeyFile.close(); return SimpleCrypt(random); } } } //End namespace Utils } //End namespace UDJ UDJ-Desktop-Client-0.6.4/src/SetLocationDialog.hpp0000664000175000017500000000341112051252546021261 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef SET_LOCATION_DIALOG_HPP #define SET_LOCATION_DIALOG_HPP #include "DialogWithLoaderWidget.hpp" namespace UDJ{ class AddressWidget; class DataStore; /** \brief Dialog for setting a player's location. */ class SetLocationDialog : public DialogWithLoaderWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a SetLocationDialog * * \param dataStore The DataStore backing the client. * \param parent The parent widget. * \param f Window flags. */ SetLocationDialog(DataStore *dataStore, QWidget *parent=0, Qt::WindowFlags f=0); //@} public slots: /** @name Overridden slots from QDialog */ //@{ /** \brief . */ virtual void accept(); //@} private: /** @name Private Members */ //@{ /** \brief Actuall widget used for setting the address. */ AddressWidget *addressWidget; /** \brief DataStore backing the client */ DataStore *dataStore; //@} /** @name Private Functions */ //@{ /** \brief Initializes UI. */ void setupUi(); //@} }; } //end namespace UDJ #endif //SET_LOCATION_DIALOG_HPP UDJ-Desktop-Client-0.6.4/src/LibraryView.cpp0000664000175000017500000001075712051252546020162 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "LibraryView.hpp" #include "Utils.hpp" #include "MusicModel.hpp" #include #include #include #include #include #include #include #include namespace UDJ{ LibraryView::LibraryView(DataStore *dataStore, QWidget* parent): QTableView(parent), dataStore(dataStore) { libraryModel = new MusicModel(getDataQuery(), dataStore, this); proxyModel = new QSortFilterProxyModel(this); proxyModel->setSourceModel(libraryModel); proxyModel->setFilterKeyColumn(-1); proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); verticalHeader()->hide(); horizontalHeader()->setStretchLastSection(true); setModel(proxyModel); setSortingEnabled(true); setSelectionBehavior(QAbstractItemView::SelectRows); setContextMenuPolicy(Qt::CustomContextMenu); configureColumns(); createActions(); connect( dataStore, SIGNAL(libSongsModified(const QSet&)), libraryModel, SLOT(refresh())); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(handleContextMenuRequest(const QPoint&))); connect( this, SIGNAL(activated(const QModelIndex&)), this, SLOT(addSongToPlaylist(const QModelIndex&))); while(libraryModel->canFetchMore()){ libraryModel->fetchMore(); } } void LibraryView::configureColumns(){ QSqlRecord record = libraryModel->record(); int idIndex = record.indexOf(DataStore::getLibIdColName()); int isDeletedIndex = record.indexOf(DataStore::getLibIsDeletedColName()); int syncStatusIndex = record.indexOf(DataStore::getLibSyncStatusColName()); int durationIndex = record.indexOf(DataStore::getLibDurationColName()); setColumnHidden(idIndex, true); setColumnHidden(isDeletedIndex, true); setColumnHidden(syncStatusIndex, true); resizeColumnToContents(durationIndex); } void LibraryView::createActions(){ deleteSongAction = new QAction(getDeleteContextMenuItemName(), this); addToPlaylistAction = new QAction(getAddToPlaylistContextMenuItemName(), this); connect( deleteSongAction, SIGNAL(triggered()), this, SLOT(deleteSongs())); connect( addToPlaylistAction, SIGNAL(triggered()), this, SLOT(addSongsToActivePlaylist())); } void LibraryView::handleContextMenuRequest(const QPoint &/*pos*/){ QMenu contextMenu(this); contextMenu.addAction(deleteSongAction); contextMenu.addAction(addToPlaylistAction); contextMenu.exec(QCursor::pos()); } void LibraryView::deleteSongs(){ QSet selectedIds = Utils::getSelectedIds( this, libraryModel, DataStore::getLibIdColName(), proxyModel); QProgressDialog *deletingProgress = new QProgressDialog(tr("Deleting Songs..."), tr("Cancel"), 0, selectedIds.size()*2, this); deletingProgress->setWindowModality(Qt::WindowModal); deletingProgress->setMinimumDuration(250); dataStore->removeSongsFromLibrary(selectedIds, deletingProgress); if(!deletingProgress->wasCanceled()){ emit libNeedsSync(); } deletingProgress->close(); } void LibraryView::filterContents(const QString& filter){ proxyModel->setFilterFixedString(filter); while(libraryModel->canFetchMore()){ libraryModel->fetchMore(); } } void LibraryView::addSongToPlaylist(const QModelIndex& index){ QModelIndex realIndex = proxyModel->mapToSource(index); QSqlRecord selectedRecord = libraryModel->record(realIndex.row()); dataStore->addSongToActivePlaylist( selectedRecord.value(DataStore::getLibIdColName()).value()); } void LibraryView::addSongsToActivePlaylist(){ dataStore->addSongsToActivePlaylist( Utils::getSelectedIds( this, libraryModel, DataStore::getLibIdColName(), proxyModel)); } }//end namespace UDJ-Desktop-Client-0.6.4/src/PlayerCreateDialog.hpp0000664000175000017500000000350512051252546021421 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef PLAYER_CREATE_DIALOG_HPP #define PLAYER_CREATE_DIALOG_HPP #include "DialogWithLoaderWidget.hpp" namespace UDJ{ class PlayerCreationWidget; class DataStore; /** \brief Dialog for creating a player. */ class PlayerCreateDialog : public DialogWithLoaderWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a PlayerCreateDialog * * \param dataStore The DataStore backing the client. * \param parent The parent widget. * \param f Window flags. */ PlayerCreateDialog(DataStore *dataStore, QWidget *parent=0, Qt::WindowFlags f=0); //@} public slots: /** @name Overridden slots from QDialog */ //@{ /** \brief . */ virtual void accept(); /** \brief . */ virtual void reject(); //@} private: /** @name Private Memeber */ //@{ /** \brief Widget used for actual creation of player */ PlayerCreationWidget *createWidget; /** \brief DataStore backing the client */ DataStore *dataStore; //@} /** @name Private Functions */ //@{ /** \brief Initializes UI. */ void setupUi(); //@} }; } //end namespace UDJ #endif //PLAYER_CREATE_DIALOG_HPP UDJ-Desktop-Client-0.6.4/src/LibraryWidget.cpp0000664000175000017500000000367612051252546020475 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "LibraryWidget.hpp" #include "DataStore.hpp" #include "LibraryView.hpp" #include #include #include namespace UDJ{ LibraryWidget::LibraryWidget(DataStore* dataStore, QWidget* parent): QWidget(parent), dataStore(dataStore) { libraryView = new LibraryView(dataStore, this); searchEdit = new QLineEdit(this); QLabel *searchLabel = new QLabel(tr("Search:"),this); setFocusPolicy(Qt::TabFocus); QGridLayout *layout = new QGridLayout(this); layout->addWidget(searchLabel,0,1,1,8, Qt::AlignRight); layout->addWidget(searchEdit,0,9,1,1); layout->addWidget(libraryView,1,0,1,10); layout->setRowStretch(1, 10); layout->setColumnStretch(0, 1); layout->setColumnStretch(1, 1); layout->setColumnStretch(2, 1); layout->setColumnStretch(3, 1); layout->setColumnStretch(4, 1); layout->setColumnStretch(5, 1); layout->setColumnStretch(6, 1); layout->setColumnStretch(7, 1); layout->setColumnStretch(8, 1); layout->setColumnStretch(9, 2); setLayout(layout); connect( searchEdit, SIGNAL(textChanged(const QString&)), libraryView, SLOT(filterContents(const QString&))); connect( libraryView, SIGNAL(libNeedsSync()), this, SIGNAL(libNeedsSync())); } } //end namespace UDJ-Desktop-Client-0.6.4/src/LoginWidget.cpp0000664000175000017500000001150312051252546020125 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "LoginWidget.hpp" #include "UDJServerConnection.hpp" #include "MetaWindow.hpp" #include #include #include #include #include #include #include #include "DataStore.hpp" namespace UDJ{ LoginWidget::LoginWidget(QWidget *parent) :WidgetWithLoader(tr("Logging in..."), parent) { serverConnection = new UDJServerConnection(this); setupUi(); connect( serverConnection, SIGNAL(authenticated(const QByteArray&, const user_id_t&)), this, SLOT(startMainGUI(const QByteArray&, const user_id_t&))); connect( serverConnection, SIGNAL(authFailed(const QString)), this, SLOT(displayLoginFailedMessage(const QString))); } void LoginWidget::setupUi(){ loginDisplay = new QWidget(this); logo = new QLabel("UDJ", this); usernameBox = new QLineEdit(this); usernameLabel = new QLabel(tr("Username")); usernameLabel->setBuddy(usernameBox); passwordBox = new QLineEdit(this); passwordBox->setEchoMode(QLineEdit::Password); passwordLabel = new QLabel(tr("Password")); passwordLabel->setBuddy(passwordBox); savePassword = new QCheckBox(tr("Remember password")); registerText = new QLabel(tr("No account? Register here")); registerText->setOpenExternalLinks(true); forgotPasswordText = new QLabel(tr("Forgot your password?")); forgotPasswordText->setOpenExternalLinks(true); connect( savePassword, SIGNAL(toggled(bool)), this, SLOT(savePasswordChanged(bool))); QGridLayout *layout = new QGridLayout; layout->addWidget(logo,0,0,1,2, Qt::AlignCenter); layout->addWidget(usernameLabel,1,0); layout->addWidget(usernameBox,1,1); layout->addWidget(passwordLabel,2,0); layout->addWidget(passwordBox,2,1); layout->addWidget(savePassword, 3, 1); layout->addWidget(forgotPasswordText, 4, 0, 1, 2, Qt::AlignCenter); layout->addWidget(registerText, 5, 0, 1, 2, Qt::AlignCenter); loginDisplay->setLayout(layout); setMainWidget(loginDisplay); showMainWidget(); //If we already have a player id we can't let the sign in with a different user //then the last one the signed in with. Otherwise bad things might happen because //the user they sign in as may not have permission to do things like set the player state. //The check for if they have a saved username or not is for people who are upgrading and may //not have saved their username in older versions but have created a player. if(DataStore::hasPlayerId() && DataStore::getSavedUsername() != "" ){ QString alreadyAssociatedMessage(tr("You have already associated a player with this computer.\n" "This means you have to login as the player's owner.")); usernameBox->setEnabled(false); usernameBox->setToolTip(alreadyAssociatedMessage); usernameLabel->setEnabled(false); usernameLabel->setToolTip(alreadyAssociatedMessage); } usernameBox->setText(DataStore::getSavedUsername()); if(DataStore::hasValidSavedPassword()){ passwordBox->setText(DataStore::getSavedPassword()); savePassword->setChecked(true); } } void LoginWidget::doLogin(){ showLoadingText(); serverConnection->authenticate(usernameBox->text(), passwordBox->text()); } void LoginWidget::startMainGUI( const QByteArray& ticketHash, const user_id_t& userId) { if(savePassword->isChecked()){ DataStore::savePassword(passwordBox->text()); } DataStore::saveUsername(usernameBox->text()); MetaWindow *metaWindow = new MetaWindow( usernameBox->text(), passwordBox->text(), ticketHash, userId); metaWindow->show(); emit startedMainGUI(); } void LoginWidget::displayLoginFailedMessage(const QString errorMessage){ emit loginFailed(); DataStore::setPasswordDirty(); showMainWidget(); setCurrentWidget(loginDisplay); QMessageBox::critical( this, tr("Login Failed"), errorMessage); } void LoginWidget::savePasswordChanged(bool newSetting){ if(!newSetting && DataStore::hasValidSavedPassword()){ DataStore::clearSavedPassword(); passwordBox->setText(""); } } }// end namespace UDJ UDJ-Desktop-Client-0.6.4/src/WidgetWithLoader.cpp0000664000175000017500000000256212051252546021124 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "WidgetWithLoader.hpp" #include namespace UDJ{ WidgetWithLoader::WidgetWithLoader(QString loadingText, QWidget *parent): QStackedWidget(parent), mainWidgetIsShowing(true) { loadingLabel = new QLabel(loadingText); loadingLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); addWidget(loadingLabel); } void WidgetWithLoader::setMainWidget(QWidget *mainWidget){ this->mainWidget = mainWidget; addWidget(mainWidget); } void WidgetWithLoader::showLoadingText(){ setCurrentWidget(loadingLabel); mainWidgetIsShowing = false; } void WidgetWithLoader::showMainWidget(){ setCurrentWidget(mainWidget); mainWidgetIsShowing = true; } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/ActivityList.hpp0000664000175000017500000000665512051252546020362 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef ACTIVITY_LIST_HPP #define ACTIVITY_LIST_HPP #include #include "ConfigDefs.hpp" class QStandardItemModel; class QStandardItem; class QActivity; namespace UDJ{ class DataStore; /** * \brief Displays the various activities that can be done in UDJ. */ class ActivityList : public QTreeView{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs an ActivityList * * @param dataStore The DataStore backing this instance of UDJ. * @param parent The parent widget. */ ActivityList(DataStore *dataStore, QWidget *parent=0); //@} /** @name Public Slots */ //@{ public slots: /** * \brief Switches the selected activity to Library. */ void switchToLibrary(); //@} signals: /** @name Signals */ //@{ /** * \brief Emitted when the library activity is clicked. */ void libraryClicked(); /** * \brief Emitted when the playlist activity is clicked. */ void playlistClicked(); /** * \brief Emitted when the participants item is clicked. */ void participantsClicked(); //@} private: /** @name Private Functions */ //@{ /** * \brief Does UI initialization. */ void setupUi(); /** * \brief Gets the name of the library activity. * * @return The name of the library activity. */ static const QString& getLibraryTitle(){ static const QString libraryTitle(tr("Library")); return libraryTitle; } /** * \brief Gets the name of the Playlist activity. * * @return The name of the Playlist activity. */ static const QString& getPlaylistTitle(){ static const QString playlistTitle(tr("Playlist")); return playlistTitle; } /** * \brief Gets the name of the Participants activity. * * @return The name of the Participants activity. */ static const QString& getParticipantsTitle(){ static const QString participantsTitle(tr("Participants")); return participantsTitle; } //@} /** @name Private Members */ //@{ /** \brief Pointer to the DataStore backing this instance of UDJ */ DataStore *dataStore; /** \brief Model used to list the activities. */ QStandardItemModel *model; /** \brief The item representing the library activity. */ QStandardItem *libraryItem; /** \brief The item representing the playlist activity. */ QStandardItem *playlistItem; /** \brief The item representing the participants activity. */ QStandardItem *participantsItem; //@} private slots: /** @name Private Slots */ //@{ /** * \brief Emits the appropriate signals when an activity is clicked. * * @param index The index of the activity that was clicked. */ void itemClicked(const QModelIndex& index); //@} }; }//end namespace UDJ #endif //ACTIVITY_LIST_HPP UDJ-Desktop-Client-0.6.4/src/LoginDialog.cpp0000664000175000017500000000270012051252546020100 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "LoginDialog.hpp" #include "LoginWidget.hpp" #include namespace UDJ{ LoginDialog::LoginDialog(QWidget *parent, Qt::WindowFlags f) :DialogWithLoaderWidget(tr("Logging In..."), tr("Login"), tr("Cancel"), true, parent, f) { setupUi(); } void LoginDialog::accept(){ showLoadingText(); loginWidget->doLogin(); } void LoginDialog::reject(){ QDialog::reject(); QApplication::quit(); } void LoginDialog::setupUi(){ loginWidget = new LoginWidget(this); setMainWidget(loginWidget); connect( loginWidget, SIGNAL(startedMainGUI()), this, SLOT(closeDialog())); connect( loginWidget, SIGNAL(loginFailed()), this, SLOT(showMainWidget())); setNegativeButtonEnabled(false); } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/LogViewer.cpp0000664000175000017500000000216512051252546017620 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "LogViewer.hpp" #include "Logger.hpp" namespace UDJ{ LogViewer::LogViewer(QWidget *parent): QTextEdit(parent) { setReadOnly(true); Q_FOREACH(QString logLine, Logger::instance()->getLog()){ append(logLine); } connect( Logger::instance(), SIGNAL(dataChanged(const QString&)), this, SLOT(updateText(const QString&))); } void LogViewer::updateText(const QString& newLogLine){ append(newLogLine); } } UDJ-Desktop-Client-0.6.4/src/PlayerDashboard.cpp0000664000175000017500000000406212051252546020757 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "PlayerDashboard.hpp" #include "DataStore.hpp" #include #include namespace UDJ{ PlayerDashboard::PlayerDashboard(DataStore *dataStore, QWidget *parent): QWidget(parent), dataStore(dataStore) { setupUi(); connect( dataStore, SIGNAL(playerCreated()), this, SLOT(setPlayerInfo())); connect( dataStore, SIGNAL(playerLocationSet()), this, SLOT(setPlayerInfo())); connect( dataStore, SIGNAL(playerPasswordSet()), this, SLOT(setPlayerInfo())); connect( dataStore, SIGNAL(playerPasswordRemoved()), this, SLOT(setPlayerInfo())); } void PlayerDashboard::setupUi(){ nameLabel = new QLabel(); locationLabel = new QLabel(); passwordLabel = new QLabel(); setPlayerInfo(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(nameLabel); layout->addWidget(passwordLabel); layout->addWidget(locationLabel); setLayout(layout); } void PlayerDashboard::setPlayerInfo(){ nameLabel->setText(tr("Player Name: ") + dataStore->getPlayerName()); passwordLabel->setText(tr("No Password Set")); if(dataStore->hasPlayerPassword()){ passwordLabel->setText(tr("Password Set")); } locationLabel->setText(tr("Location: Not Set")); if(dataStore->hasLocation()){ locationLabel->setText(tr("Location: ") + dataStore->getLocationString()); } } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/ActivePlaylistModel.cpp0000664000175000017500000000271312051252546021632 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "DataStore.hpp" #include "ActivePlaylistModel.hpp" #include #include namespace UDJ{ ActivePlaylistModel::ActivePlaylistModel( const QString& query, DataStore *dataStore, QObject *parent) :MusicModel(query, dataStore, parent) {} QVariant ActivePlaylistModel::data(const QModelIndex& item, int role) const{ int timeAddedIndex = record().indexOf(DataStore::getTimeAddedColName()); QVariant actualData = MusicModel::data(item, role); if(item.column() == timeAddedIndex && role == Qt::DisplayRole){ QDateTime timeAdded = QDateTime::fromString(actualData.toString(),Qt::ISODate); timeAdded.setTimeSpec(Qt::UTC); return timeAdded.toLocalTime().toString("h:mm ap"); } else{ return actualData; } } } //end namespace UDJ UDJ-Desktop-Client-0.6.4/src/MetaWindow.cpp0000664000175000017500000003675412051252546020006 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "MetaWindow.hpp" #include "MusicFinder.hpp" #include "DataStore.hpp" #include "LibraryWidget.hpp" #include "ActivityList.hpp" #include "ActivePlaylistView.hpp" #include "PlayerCreateDialog.hpp" #include "PlayerDashboard.hpp" #include "Logger.hpp" #include "AboutWidget.hpp" #include "LogViewer.hpp" #include "SetLocationDialog.hpp" #include "ParticipantsView.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace UDJ{ MetaWindow::MetaWindow( const QString& username, const QString& password, const QByteArray& ticketHash, const user_id_t& userId, QWidget *parent, Qt::WindowFlags flags) :QMainWindow(parent,flags), isQuiting(false), hasHardAuthFailure(false) { dataStore = new DataStore(username, password, ticketHash, userId, this); #if IS_WINDOWS_BUILD updater = new qtsparkle::Updater( QUrl(UDJ_WINDOWS_UPDATE_URL), this); #endif createActions(); setupUi(); setupMenus(); QSettings settings( QSettings::UserScope, DataStore::getSettingsOrg(), DataStore::getSettingsApp()); if(settings.contains("metaWindowGeometry")){ restoreGeometry(settings.value("metaWindowGeometry").toByteArray()); restoreState(settings.value("metaWindowState").toByteArray()); } else{ setWindowState(Qt::WindowMaximized); } if(dataStore->hasPlayerId()){ dataStore->playPlayer(); dataStore->startPlaylistAutoRefresh(); dataStore->startParticipantsAutoRefresh(); if(dataStore->hasUnsyncedSongs()){ syncLibrary(); } } else{ PlayerCreateDialog *createDialog = new PlayerCreateDialog(dataStore, this); createDialog->show(); } connect( dataStore, SIGNAL(playerPasswordSet()), this, SLOT(enableRemovePassword())); connect( dataStore, SIGNAL(playerPasswordRemoved()), this, SLOT(disableRemovePassword())); connect( dataStore, SIGNAL(playerCreated()), this, SLOT(checkForITunes())); connect( dataStore, SIGNAL(playerCreated()), dataStore, SLOT(playPlayer())); connect( dataStore, SIGNAL(playerCreated()), dataStore, SLOT(startPlaylistAutoRefresh())); connect( dataStore, SIGNAL(playerCreated()), dataStore, SLOT(startParticipantsAutoRefresh())); connect( dataStore, SIGNAL(hardAuthFailure()), this, SLOT(onHardAuthFailure())); connect( dataStore, SIGNAL(playerLocationSetError(const QString&)), this, SLOT(onPlayerLocationSetError(const QString&))); connect( dataStore, SIGNAL(playerPasswordRemoveError(const QString&)), this, SLOT(onPlayerPasswordRemoveError(const QString&))); } void MetaWindow::closeEvent(QCloseEvent *event){ if(!isQuiting && !hasHardAuthFailure){ isQuiting = true; connect( dataStore, SIGNAL(playerSuccessfullySetInactive()), this, SLOT(close())); //NOTE NOT HANDLING IF THERE WAS AN ERROR SETTING THE PLAYER INACTIVE NEED TO HANDLE THIS quittingProgress = new QProgressDialog("Disconnecting...", "Cancel", 0, 0, this); quittingProgress->setWindowModality(Qt::WindowModal); quittingProgress->setMinimumDuration(250); dataStore->setPlayerInactive(); event->ignore(); } else{ QSettings settings( QSettings::UserScope, DataStore::getSettingsOrg(), DataStore::getSettingsApp()); settings.setValue("metaWindowGeometry", saveGeometry()); settings.setValue("metaWindowState", saveState()); QMainWindow::closeEvent(event); } } bool MetaWindow::eventFilter(QObject* /*obj*/, QEvent *event){ if(event->type() == QEvent::KeyRelease){ QKeyEvent *keyEvent = static_cast(event); if(keyEvent->key() == Qt::Key_Space){ playbackWidget->togglePlaybackState(); return true; } } return false; } bool MetaWindow::hasItunesLibrary(){ QString musicDir = QDesktopServices::storageLocation(QDesktopServices::MusicLocation); QDir iTunesDir = QDir(musicDir).filePath("iTunes"); return iTunesDir.exists("iTunes Music Library.xml"); } void MetaWindow::checkForITunes(){ if(hasItunesLibrary()){ QMessageBox::StandardButton response = QMessageBox::question( this, "Import iTunes Library", "Looks like you've got iTunes installed. Would you like" " us to try to import your iTunes Library?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if(response == QMessageBox::Yes){ scanItunesLibrary(); } } else{ Logger::instance()->log("iTunes dir doesn't exist"); } } void MetaWindow::scanItunesLibrary(){ QString musicDir = QDesktopServices::storageLocation(QDesktopServices::MusicLocation); QDir iTunesDir = QDir(musicDir).filePath("iTunes"); QList musicToAdd = MusicFinder::findItunesMusic(iTunesDir.filePath("iTunes Music Library.xml"), dataStore); Logger::instance()->log("Size of itunes was: " + QString::number(musicToAdd.size())); addMediaSources(musicToAdd); } void MetaWindow::addMediaSources(const QList& musicToAdd){ if(musicToAdd.isEmpty()){ QMessageBox::information( this, "No Music Found", "Sorry, but we couldn't find any new music that we know how to play."); return; } int numNewFiles = musicToAdd.size(); QProgressDialog *addingProgress = new QProgressDialog( "Loading Library...", "Cancel", 0, numNewFiles, this); addingProgress->setWindowModality(Qt::WindowModal); addingProgress->setMinimumDuration(250); dataStore->addMusicToLibrary(musicToAdd, addingProgress); if(!addingProgress->wasCanceled()){ syncLibrary(); } addingProgress->close(); } void MetaWindow::addMusicToLibrary(){ QString musicDir = QFileDialog::getExistingDirectory(this, tr("Pick folder to add"), QDir::homePath(), QFileDialog::ShowDirsOnly); Logger::instance()->log("got directory: " + musicDir); if(musicDir == ""){ return; } QList musicToAdd = MusicFinder::findMusicInDir(musicDir, dataStore); addMediaSources(musicToAdd); } void MetaWindow::addSongToLibrary(){ QString fileName = QFileDialog::getOpenFileName( this, tr("Pick song to add"), QDir::homePath(), tr("Audio Files ") + MusicFinder::getMusicFileExtFilter()); if(fileName == ""){ return; } if(dataStore->alreadyHaveSongInLibrary(fileName)){ QMessageBox::information( this, "Already In Library", "You already have that song in your music library"); return; } QList songList; songList.append(Phonon::MediaSource(fileName)); dataStore->addMusicToLibrary(songList); syncLibrary(); } void MetaWindow::setupUi(){ playbackWidget = new PlaybackWidget(dataStore, this); libraryWidget = new LibraryWidget(dataStore, this); libraryWidget->installEventFilter(this); activityList = new ActivityList(dataStore); playlistView = new ActivePlaylistView(dataStore, this); playlistView->installEventFilter(this); participantsView = new ParticipantsView(dataStore, this); participantsView->installEventFilter(this); QWidget* contentStackContainer = new QWidget(this); contentStack = new QStackedWidget(this); contentStack->addWidget(libraryWidget); contentStack->addWidget(playlistView); contentStack->addWidget(participantsView); contentStack->setCurrentWidget(libraryWidget); QVBoxLayout *contentStackLayout = new QVBoxLayout; contentStackLayout->addWidget(contentStack, Qt::AlignCenter); contentStackContainer->setLayout(contentStackLayout); QSplitter *content = new QSplitter(Qt::Horizontal, this); content->addWidget(activityList); content->addWidget(contentStackContainer); content->setStretchFactor(1, 10); dashboard = new PlayerDashboard(dataStore, this); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(dashboard); mainLayout->addWidget(content,6); mainLayout->addWidget(playbackWidget); QWidget* widget = new QWidget; widget->setLayout(mainLayout); setCentralWidget(widget); setWindowTitle("UDJ"); connect( activityList, SIGNAL(libraryClicked()), this, SLOT(displayLibrary())); connect( activityList, SIGNAL(playlistClicked()), this, SLOT(displayPlaylist())); connect( activityList, SIGNAL(participantsClicked()), this, SLOT(displayParticipants())); connect( libraryWidget, SIGNAL(libNeedsSync()), this, SLOT(syncLibrary())); } void MetaWindow::createActions(){ quitAction = new QAction(tr("&Quit"), this); quitAction->setShortcuts(QKeySequence::Quit); addMusicAction = new QAction(tr("Add &Music Folder"), this); addMusicAction->setShortcut(tr("Ctrl+M")); addSongAction = new QAction(tr("A&dd Single Song"), this); addSongAction->setShortcut(tr("Ctrl+D")); viewLogAction = new QAction(tr("View Lo&g"), this); viewLogAction->setShortcut(tr("Ctrl+G")); viewAboutAction = new QAction(tr("About"), this); rescanItunesAction = new QAction(tr("Rescan iTunes Library"), this); #if IS_WINDOWS_BUILD checkUpdateAction = new QAction(tr("Check For Updates"), this); connect(checkUpdateAction, SIGNAL(triggered()), updater, SLOT(CheckNow())); #endif connect(addMusicAction, SIGNAL(triggered()), this, SLOT(addMusicToLibrary())); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(addSongAction, SIGNAL(triggered()), this, SLOT(addSongToLibrary())); connect(viewLogAction, SIGNAL(triggered()), this, SLOT(displayLogView())); connect(viewAboutAction, SIGNAL(triggered()), this, SLOT(displayAboutWidget())); connect(rescanItunesAction, SIGNAL(triggered()), this, SLOT(scanItunesLibrary())); } void MetaWindow::setupMenus(){ QMenu *musicMenu = menuBar()->addMenu(tr("&Music")); musicMenu->addAction(addMusicAction); musicMenu->addAction(addSongAction); if(hasItunesLibrary()){ musicMenu->addAction(rescanItunesAction); } musicMenu->addSeparator(); musicMenu->addAction(quitAction); configurePlayerMenu(); QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(viewLogAction); helpMenu->addAction(viewAboutAction); #if IS_WINDOWS_BUILD helpMenu->addAction(checkUpdateAction); #endif } void MetaWindow::configurePlayerMenu(){ QMenu *playerMenu = menuBar()->addMenu(tr("&Player")); setLocationAction = new QAction(tr("Set &Location"), this); setLocationAction->setShortcut(tr("Ctrl+L")); playerMenu->addAction(setLocationAction); setPasswordAction = new QAction(tr("Set Password"), this); playerMenu->addAction(setPasswordAction); removePasswordAction = new QAction(tr("Remove Password"), this); playerMenu->addAction(removePasswordAction); removePasswordAction->setEnabled(dataStore->hasPlayerPassword()); connect(setLocationAction, SIGNAL(triggered()), this, SLOT(setPlayerLocation())); connect(setPasswordAction, SIGNAL(triggered()), this, SLOT(setPlayerPassword())); connect(removePasswordAction, SIGNAL(triggered()), this, SLOT(removePlayerPassword())); } void MetaWindow::removePlayerPassword(){ QMessageBox::StandardButton response = QMessageBox::question( this, tr("Remove password"), tr("Are you sure you want to remove the player password"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); if(response == QMessageBox::Ok){ dataStore->removePlayerPassword(); } } void MetaWindow::onPlayerPasswordRemoveError(const QString& /*errMessage*/){ QMessageBox::critical(this, tr("Error Removing Password"), tr("Oops. We couldn't remove the " "player's password. We're super sorry. Can you try it again in a little bit?")); } void MetaWindow::setPlayerPassword(){ bool ok; QString newPlayerPassword = QInputDialog::getText(this, tr("Set Player Password"), tr("Password:"), QLineEdit::Normal, tr("New Password"), &ok); if(ok){ if(newPlayerPassword != ""){ dataStore->setPlayerPassword(newPlayerPassword); } else{ QMessageBox::critical(this, "Player Password Error", "Player passwords can't be blank."); } } } void MetaWindow::setPlayerLocation(){ SetLocationDialog *setLocationDialog = new SetLocationDialog(dataStore, this); setLocationDialog->show(); } void MetaWindow::displayLibrary(){ contentStack->setCurrentWidget(libraryWidget); } void MetaWindow::displayPlaylist(){ contentStack->setCurrentWidget(playlistView); } void MetaWindow::displayParticipants(){ contentStack->setCurrentWidget(participantsView); } void MetaWindow::syncLibrary(){ syncingProgress = new QProgressDialog( "Syncing Library...", "Cancel", 0, dataStore->getTotalUnsynced(), this); syncingProgress->setWindowModality(Qt::WindowModal); syncingProgress->setMinimumDuration(250); syncingProgress->setCancelButton(0); connect( dataStore, SIGNAL(libSongsModified(const QSet&)), this, SLOT(syncUpdate(const QSet&))); connect( dataStore, SIGNAL(allSynced()), this, SLOT(syncDone())); connect( dataStore, SIGNAL(libModError(const QString&)), this, SLOT(syncError(const QString&))); dataStore->syncLibrary(); syncingProgress->setValue(0); } void MetaWindow::syncUpdate(const QSet& songs){ syncingProgress->setValue(syncingProgress->value() + songs.size()); } void MetaWindow::disconnectSyncSignals(){ disconnect( dataStore, SIGNAL(libSongsModified(const QSet&)), this, SLOT(syncUpdate(const QSet&))); disconnect( dataStore, SIGNAL(allSynced()), this, SLOT(syncDone())); disconnect( dataStore, SIGNAL(libModError(const QString&)), this, SLOT(syncError(const QString&))); } void MetaWindow::syncDone(){ disconnectSyncSignals(); syncingProgress->close(); } void MetaWindow::syncError(const QString& /*errMessage*/){ disconnectSyncSignals(); syncingProgress->close(); QMessageBox::critical(this, "Error", "Error syncing library. We'll try again next time you startup UDJ"); } void MetaWindow::displayLogView(){ LogViewer *viewer = new LogViewer(); viewer->show(); } void MetaWindow::displayAboutWidget(){ AboutWidget *about = new AboutWidget(); about->show(); } void MetaWindow::enableRemovePassword(){ removePasswordAction->setEnabled(true); } void MetaWindow::disableRemovePassword(){ removePasswordAction->setEnabled(false); } void MetaWindow::onHardAuthFailure(){ hasHardAuthFailure = true; QMessageBox::critical(this, tr("Bad password"), tr("It appears you have changed your password " "since you last logged in. Please restart UDJ with your new password.")); close(); } void MetaWindow::onPlayerLocationSetError(const QString& errMessage){ QMessageBox::critical(this, tr("Error Setting Location"), errMessage); setPlayerLocation(); } } //end namespace UDJ-Desktop-Client-0.6.4/src/qt-json/0000775000175000017500000000000012051252546016600 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/src/qt-json/LICENSE0000664000175000017500000000273412051252546017613 0ustar kurtiskurtisCopyright 2011 Eeli Reilin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EELI REILIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Eeli Reilin. UDJ-Desktop-Client-0.6.4/src/qt-json/README0000664000175000017500000000533412051252546017465 0ustar kurtiskurtis######################################################################## 1. INTRODUCTION The Json class is a simple class for parsing JSON data into a QVariant hierarchies. Now, we can also reverse the process and serialize QVariant hierarchies into valid JSON data. ######################################################################## 2. HOW TO USE The parser is really easy to use. Let's say we have the following QString of JSON data: ------------------------------------------------------------------------ { "encoding" : "UTF-8", "plug-ins" : [ "python", "c++", "ruby" ], "indent" : { "length" : 3, "use_space" : true } } ------------------------------------------------------------------------ We would first call the parse-method: ------------------------------------------------------------------------ //Say that we're using the QtJson namespace using namepsace QtJson; bool ok; //json is a QString containing the JSON data QVariantMap result = Json::parse(json, ok).toMap(); if(!ok) { qFatal("An error occurred during parsing"); exit(1); } ------------------------------------------------------------------------ Assuming the parsing process completed without errors, we would then go through the hierarchy: ------------------------------------------------------------------------ qDebug() << "encoding:" << result["encoding"].toString(); qDebug() << "plugins:"; foreach(QVariant plugin, result["plug-ins"].toList()) { qDebug() << "\t-" << plugin.toString(); } QVariantMap nestedMap = result["indent"].toMap(); qDebug() << "length:" << nestedMap["length"].toInt(); qDebug() << "use_space:" << nestedMap["use_space"].toBool(); ------------------------------------------------------------------------ The previous code would print out the following: ------------------------------------------------------------------------ encoding: "UTF-8" plugins: - "python" - "c++" - "ruby" length: 3 use_space: true ------------------------------------------------------------------------ To write JSON data from Qt object is as simple as parsing: ------------------------------------------------------------------------ QVariantMap map; map["name"] = "Name"; map["age"] = 22; QByteArray data = Json::serialize(map); ------------------------------------------------------------------------ The byte array 'data' contains valid JSON data: ------------------------------------------------------------------------ { name: "Luis Gustavo", age: 22, } ------------------------------------------------------------------------ ######################################################################## 4. CONTRIBUTING The code is available to download at GitHub. Contribute if you dare! UDJ-Desktop-Client-0.6.4/src/qt-json/AUTHORS0000664000175000017500000000020112051252546017641 0ustar kurtiskurtisEeli Reilin Luis Gustavo S. Barreto Stephen Kockentiedt UDJ-Desktop-Client-0.6.4/src/qt-json/json.cpp0000664000175000017500000004256112051252546020265 0ustar kurtiskurtis/* Copyright 2011 Eeli Reilin. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY ''AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL EELI REILIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation * are those of the authors and should not be interpreted as representing * official policies, either expressed or implied, of Eeli Reilin. */ /** * \file json.cpp */ #include "json.h" #include namespace QtJson { static QString sanitizeString(QString str) { str.replace(QLatin1String("\\"), QLatin1String("\\\\")); str.replace(QLatin1String("\""), QLatin1String("\\\"")); str.replace(QLatin1String("\b"), QLatin1String("\\b")); str.replace(QLatin1String("\f"), QLatin1String("\\f")); str.replace(QLatin1String("\n"), QLatin1String("\\n")); str.replace(QLatin1String("\r"), QLatin1String("\\r")); str.replace(QLatin1String("\t"), QLatin1String("\\t")); return QString(QLatin1String("\"%1\"")).arg(str); } static QByteArray join(const QList &list, const QByteArray &sep) { QByteArray res; Q_FOREACH(const QByteArray &i, list) { if(!res.isEmpty()) { res += sep; } res += i; } return res; } /** * parse */ QVariant Json::parse(const QString &json) { bool success = true; return Json::parse(json, success); } /** * parse */ QVariant Json::parse(const QString &json, bool &success) { success = true; //Return an empty QVariant if the JSON data is either null or empty if(!json.isNull() || !json.isEmpty()) { QString data = json; //We'll start from index 0 int index = 0; //Parse the first value QVariant value = Json::parseValue(data, index, success); //Return the parsed value return value; } else { //Return the empty QVariant return QVariant(); } } QByteArray Json::serialize(const QVariant &data) { bool success = true; return Json::serialize(data, success); } QByteArray Json::serialize(const QVariant &data, bool &success) { QByteArray str; success = true; if(!data.isValid()) // invalid or null? { str = "null"; } else if((data.type() == QVariant::List) || (data.type() == QVariant::StringList)) // variant is a list? { QList values; const QVariantList list = data.toList(); Q_FOREACH(const QVariant& v, list) { QByteArray serializedValue = serialize(v); if(serializedValue.isNull()) { success = false; break; } values << serializedValue; } str = "[ " + join( values, ", " ) + " ]"; } else if(data.type() == QVariant::Map) // variant is a map? { const QVariantMap vmap = data.toMap(); QMapIterator it( vmap ); str = "{ "; QList pairs; while(it.hasNext()) { it.next(); QByteArray serializedValue = serialize(it.value()); if(serializedValue.isNull()) { success = false; break; } pairs << sanitizeString(it.key()).toUtf8() + " : " + serializedValue; } str += join(pairs, ", "); str += " }"; } else if((data.type() == QVariant::String) || (data.type() == QVariant::ByteArray)) // a string or a byte array? { str = sanitizeString(data.toString()).toUtf8(); } else if(data.type() == QVariant::Double) // double? { str = QByteArray::number(data.toDouble(), 'g', 20); if(!str.contains(".") && ! str.contains("e")) { str += ".0"; } } else if (data.type() == QVariant::Bool) // boolean value? { str = data.toBool() ? "true" : "false"; } else if (data.type() == QVariant::ULongLong) // large unsigned number? { str = QByteArray::number(data.value()); } else if ( data.canConvert() ) // any signed number? { str = QByteArray::number(data.value()); } else if (data.canConvert()) { str = QString::number(data.value()).toUtf8(); } else if (data.canConvert()) // can value be converted to string? { // this will catch QDate, QDateTime, QUrl, ... str = sanitizeString(data.toString()).toUtf8(); } else { success = false; } if (success) { return str; } else { return QByteArray(); } } /** * parseValue */ QVariant Json::parseValue(const QString &json, int &index, bool &success) { //Determine what kind of data we should parse by //checking out the upcoming token switch(Json::lookAhead(json, index)) { case JsonTokenString: return Json::parseString(json, index, success); case JsonTokenNumber: return Json::parseNumber(json, index); case JsonTokenCurlyOpen: return Json::parseObject(json, index, success); case JsonTokenSquaredOpen: return Json::parseArray(json, index, success); case JsonTokenTrue: Json::nextToken(json, index); return QVariant(true); case JsonTokenFalse: Json::nextToken(json, index); return QVariant(false); case JsonTokenNull: Json::nextToken(json, index); return QVariant(); case JsonTokenNone: break; } //If there were no tokens, flag the failure and return an empty QVariant success = false; return QVariant(); } /** * parseObject */ QVariant Json::parseObject(const QString &json, int &index, bool &success) { QVariantMap map; int token; //Get rid of the whitespace and increment index Json::nextToken(json, index); //Loop through all of the key/value pairs of the object bool done = false; while(!done) { //Get the upcoming token token = Json::lookAhead(json, index); if(token == JsonTokenNone) { success = false; return QVariantMap(); } else if(token == JsonTokenComma) { Json::nextToken(json, index); } else if(token == JsonTokenCurlyClose) { Json::nextToken(json, index); return map; } else { //Parse the key/value pair's name QString name = Json::parseString(json, index, success).toString(); if(!success) { return QVariantMap(); } //Get the next token token = Json::nextToken(json, index); //If the next token is not a colon, flag the failure //return an empty QVariant if(token != JsonTokenColon) { success = false; return QVariant(QVariantMap()); } //Parse the key/value pair's value QVariant value = Json::parseValue(json, index, success); if(!success) { return QVariantMap(); } //Assign the value to the key in the map map[name] = value; } } //Return the map successfully return QVariant(map); } /** * parseArray */ QVariant Json::parseArray(const QString &json, int &index, bool &success) { QVariantList list; Json::nextToken(json, index); bool done = false; while(!done) { int token = Json::lookAhead(json, index); if(token == JsonTokenNone) { success = false; return QVariantList(); } else if(token == JsonTokenComma) { Json::nextToken(json, index); } else if(token == JsonTokenSquaredClose) { Json::nextToken(json, index); break; } else { QVariant value = Json::parseValue(json, index, success); if(!success) { return QVariantList(); } list.push_back(value); } } return QVariant(list); } /** * parseString */ QVariant Json::parseString(const QString &json, int &index, bool &success) { QString s; QChar c; Json::eatWhitespace(json, index); c = json[index++]; bool complete = false; while(!complete) { if(index == json.size()) { break; } c = json[index++]; if(c == '\"') { complete = true; break; } else if(c == '\\') { if(index == json.size()) { break; } c = json[index++]; if(c == '\"') { s.append('\"'); } else if(c == '\\') { s.append('\\'); } else if(c == '/') { s.append('/'); } else if(c == 'b') { s.append('\b'); } else if(c == 'f') { s.append('\f'); } else if(c == 'n') { s.append('\n'); } else if(c == 'r') { s.append('\r'); } else if(c == 't') { s.append('\t'); } else if(c == 'u') { int remainingLength = json.size() - index; if(remainingLength >= 4) { QString unicodeStr = json.mid(index, 4); int symbol = unicodeStr.toInt(0, 16); s.append(QChar(symbol)); index += 4; } else { break; } } } else { s.append(c); } } if(!complete) { success = false; return QVariant(); } return QVariant(s); } /** * parseNumber */ QVariant Json::parseNumber(const QString &json, int &index) { Json::eatWhitespace(json, index); int lastIndex = Json::lastIndexOfNumber(json, index); int charLength = (lastIndex - index) + 1; QString numberStr; numberStr = json.mid(index, charLength); index = lastIndex + 1; if (numberStr.contains('.')) { return QVariant(numberStr.toDouble(NULL)); } else if (numberStr.startsWith('-')) { return QVariant(numberStr.toLongLong(NULL)); } else { return QVariant(numberStr.toULongLong(NULL)); } } /** * lastIndexOfNumber */ int Json::lastIndexOfNumber(const QString &json, int index) { int lastIndex; for(lastIndex = index; lastIndex < json.size(); lastIndex++) { if(QString("0123456789+-.eE").indexOf(json[lastIndex]) == -1) { break; } } return lastIndex -1; } /** * eatWhitespace */ void Json::eatWhitespace(const QString &json, int &index) { for(; index < json.size(); index++) { if(QString(" \t\n\r").indexOf(json[index]) == -1) { break; } } } /** * lookAhead */ int Json::lookAhead(const QString &json, int index) { int saveIndex = index; return Json::nextToken(json, saveIndex); } /** * nextToken */ int Json::nextToken(const QString &json, int &index) { Json::eatWhitespace(json, index); if(index == json.size()) { return JsonTokenNone; } QChar c = json[index]; index++; switch(c.toAscii()) { case '{': return JsonTokenCurlyOpen; case '}': return JsonTokenCurlyClose; case '[': return JsonTokenSquaredOpen; case ']': return JsonTokenSquaredClose; case ',': return JsonTokenComma; case '"': return JsonTokenString; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '-': return JsonTokenNumber; case ':': return JsonTokenColon; } index--; int remainingLength = json.size() - index; //True if(remainingLength >= 4) { if (json[index] == 't' && json[index + 1] == 'r' && json[index + 2] == 'u' && json[index + 3] == 'e') { index += 4; return JsonTokenTrue; } } //False if (remainingLength >= 5) { if (json[index] == 'f' && json[index + 1] == 'a' && json[index + 2] == 'l' && json[index + 3] == 's' && json[index + 4] == 'e') { index += 5; return JsonTokenFalse; } } //Null if (remainingLength >= 4) { if (json[index] == 'n' && json[index + 1] == 'u' && json[index + 2] == 'l' && json[index + 3] == 'l') { index += 4; return JsonTokenNull; } } return JsonTokenNone; } } //end namespace UDJ-Desktop-Client-0.6.4/src/qt-json/json.h0000664000175000017500000001621512051252546017727 0ustar kurtiskurtis/* Copyright 2011 Eeli Reilin. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY ''AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL EELI REILIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation * are those of the authors and should not be interpreted as representing * official policies, either expressed or implied, of Eeli Reilin. */ /** * \file json.h */ #ifndef JSON_H #define JSON_H #include #include namespace QtJson { /** * \enum JsonToken */ enum JsonToken { JsonTokenNone = 0, JsonTokenCurlyOpen = 1, JsonTokenCurlyClose = 2, JsonTokenSquaredOpen = 3, JsonTokenSquaredClose = 4, JsonTokenColon = 5, JsonTokenComma = 6, JsonTokenString = 7, JsonTokenNumber = 8, JsonTokenTrue = 9, JsonTokenFalse = 10, JsonTokenNull = 11 }; /** * \class Json * \brief A JSON data parser * * Json parses a JSON data into a QVariant hierarchy. */ class Json { public: /** * Parse a JSON string * * \param json The JSON data */ static QVariant parse(const QString &json); /** * Parse a JSON string * * \param json The JSON data * \param success The success of the parsing */ static QVariant parse(const QString &json, bool &success); /** * This method generates a textual JSON representation * * \param data The JSON data generated by the parser. * \param success The success of the serialization */ static QByteArray serialize(const QVariant &data); /** * This method generates a textual JSON representation * * \param data The JSON data generated by the parser. * \param success The success of the serialization * * \return QByteArray Textual JSON representation */ static QByteArray serialize(const QVariant &data, bool &success); private: /** * Parses a value starting from index * * \param json The JSON data * \param index The start index * \param success The success of the parse process * * \return QVariant The parsed value */ static QVariant parseValue(const QString &json, int &index, bool &success); /** * Parses an object starting from index * * \param json The JSON data * \param index The start index * \param success The success of the object parse * * \return QVariant The parsed object map */ static QVariant parseObject(const QString &json, int &index, bool &success); /** * Parses an array starting from index * * \param json The JSON data * \param index The starting index * \param success The success of the array parse * * \return QVariant The parsed variant array */ static QVariant parseArray(const QString &json, int &index, bool &success); /** * Parses a string starting from index * * \param json The JSON data * \param index The starting index * \param success The success of the string parse * * \return QVariant The parsed string */ static QVariant parseString(const QString &json, int &index, bool &success); /** * Parses a number starting from index * * \param json The JSON data * \param index The starting index * * \return QVariant The parsed number */ static QVariant parseNumber(const QString &json, int &index); /** * Get the last index of a number starting from index * * \param json The JSON data * \param index The starting index * * \return The last index of the number */ static int lastIndexOfNumber(const QString &json, int index); /** * Skip unwanted whitespace symbols starting from index * * \param json The JSON data * \param index The start index */ static void eatWhitespace(const QString &json, int &index); /** * Check what token lies ahead * * \param json The JSON data * \param index The starting index * * \return int The upcoming token */ static int lookAhead(const QString &json, int index); /** * Get the next JSON token * * \param json The JSON data * \param index The starting index * * \return int The next JSON token */ static int nextToken(const QString &json, int &index); }; } //end namespace #endif //JSON_H UDJ-Desktop-Client-0.6.4/src/main.cpp0000664000175000017500000000365312051252546016644 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include #include #include "LoginDialog.hpp" #include "ConfigDefs.hpp" #include "Logger.hpp" #if IS_APPLE_BUILD //#include "UDJApp_Mac.h" #endif #ifdef HAS_CUSTOM_CA_CERT #include #include #include #endif int main(int argc, char* argv[]){ #if IS_APPLE_BUILD //macMain(); #endif QApplication app(argc, argv); //QIcon windowIcon("udjlauncher.svg"); //QApplication::setWindowIcon(windowIcon); app.setApplicationName("Udj"); app.setApplicationVersion(UDJ_VERSION); app.setQuitOnLastWindowClosed(true); UDJ::LoginDialog loginDialog; loginDialog.show(); #ifdef HAS_CUSTOM_CA_CERT QFile servercaFile("serverca.pem"); if(servercaFile.exists()){ UDJ::Logger::instance()->log("Explicitly setting server cas"); servercaFile.open(QIODevice::ReadOnly); QList cas; QSslCertificate serverca(&servercaFile); cas.append(serverca); servercaFile.close(); QSslConfiguration defaultConfig = QSslConfiguration::defaultConfiguration(); defaultConfig.setCaCertificates(cas); QSslConfiguration::setDefaultConfiguration(defaultConfig); } #endif int toReturn = app.exec(); UDJ::Logger::deleteLogger(); return toReturn; } UDJ-Desktop-Client-0.6.4/src/MetaWindow.hpp0000664000175000017500000002040312051252546017773 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef METAWINDOW_HPP #define METAWINDOW_HPP #include #include #include //#include #include #include "UDJServerConnection.hpp" #include "PlaybackWidget.hpp" #if IS_WINDOWS_BUILD #include #endif class QTabWidget; class QPushButton; class QAction; class QLabel; class QSplitter; class QStackedWidget; class QCloseEvent; class QProgressDialog; namespace UDJ{ class ActivePlaylistView; class LibraryWidget; class ActivityList; class EventWidget; class DataStore; class PlayerDashboard; class ParticipantsView; /** * \brief A class that is the main point of interaction with the user. * * This is the main window with which the user will interact. It contains * all information about the current playlist, their music, and any other relevant * information. */ class MetaWindow : public QMainWindow{ Q_OBJECT public: /** @name Constructor(s) */ //@{ /** \brief Constructs a MetaWindow * * @param username The username being used by the client. * @param password The password being used by the client. * @param ticketHash Ticket hash that should be used by the data store. * @param userId UserId that should be used by the data store. * @param parent The parent widget * @param flags Any window flags. */ MetaWindow( const QString& username, const QString& password, const QByteArray& ticketHash, const user_id_t& userId, QWidget *parent=0, Qt::WindowFlags flags=0); //@} protected: /** @name Overridden from QMainWindow */ //@{ /** \brief . */ virtual void closeEvent(QCloseEvent *event); /** \brief . */ bool eventFilter(QObject *obj, QEvent *event); //@} private slots: /** @name Private Slots */ //@{ /** \brief Inform the user their current credentials no longer work. */ void onHardAuthFailure(); /** * \brief Performs appropriate actions when there is an error setting the location of the player. */ void onPlayerLocationSetError(const QString& errMessage); /** \brief Shows the logger view. */ void displayLogView(); /** \brief Shows the about widget. */ void displayAboutWidget(); /** \brief Initiates the syncing of the library. */ void syncLibrary(); /** * \brief Displays stuff for adding songs to a library. */ void addMusicToLibrary(); /** * \brief Displays stuff for adding a single to the library. */ void addSongToLibrary(); /** * \brief Displays the library widget in the main content panel. */ void displayLibrary(); /** * \brief Displays the playlist view in the main content panel. */ void displayPlaylist(); /** * \brief Displays the participants view in the main content panel. */ void displayParticipants(); /** * \brief Updates the syncprogress given the songs that have been updated. * * \param songs Songs that were updated. */ void syncUpdate(const QSet& songs); /** * \brief Performs necessary actions when the library syncing is done. */ void syncDone(); /** * \brief Performs necessary actions when the library syncing has an error. * * \param errMessage The error message given on a sync error. */ void syncError(const QString& errMessage); /** * \brief Preforms necessary actions in order to start setting the player's location. */ void setPlayerLocation(); /** * \brief Performs necessary actions in order to start setting the player's password. */ void setPlayerPassword(); /** * \brief Scans the iTunes library for any music that can be added to the music library and * attempts to add them. */ void scanItunesLibrary(); /** * \brief Performs necessary actions in order to start removing the player's password. */ void removePlayerPassword(); /** * \brief Preforms necessary actions when there was an error removing the player password. * * \param errMessage A message describing the error. */ void onPlayerPasswordRemoveError(const QString& errMessage); /** * \brief Enables the ability to remove the player password. */ void enableRemovePassword(); /** * \brief Disables the ability to remove the player password. */ void disableRemovePassword(); /** * \brief Checks to see if the user has an iTunes directory that we can scan for music. */ void checkForITunes(); //@} private: /** @name Private Members */ //@{ /** \brief Used to display the contents of the users media library */ LibraryWidget* libraryWidget; /** \brief The users media library */ DataStore* dataStore; /** \brief Triggers selection of music directory. */ QAction *addMusicAction; /** \brief Causes the application to quit. */ QAction *quitAction; /** \brief Trigers addition of single song to the library */ QAction *addSongAction; /** \brief Triggers display of the log viewer */ QAction *viewLogAction; /** \brief Triggers display of the about widget */ QAction *viewAboutAction; /** \brief Triggers the setting of the player location. */ QAction *setLocationAction; /** \brief Triggers rescanning of the iTunes Library. */ QAction *rescanItunesAction; /** * \brief Triggers the setting of the player password. */ QAction *setPasswordAction; /** * \brief Triggers the removal of the player password. */ QAction *removePasswordAction; #if IS_WINDOWS_BUILD /** * \brief Checks to se if there is an update available for the player. */ QAction* checkUpdateAction; #endif // QFileSystemWatcher* fileWatcher; /** \brief The main display widget. */ QWidget *mainWidget; /** \brief The list of potential activites that can be done in UDJ. */ ActivityList *activityList; /** \brief Widget used for controlling music playback. */ PlaybackWidget *playbackWidget; /** \brief Widget used to display the active playlist. */ ActivePlaylistView *playlistView; /** \brief Progress dialog used when quitting.*/ QProgressDialog *quittingProgress; /** \brief Progress dialog used syncing library.*/ QProgressDialog *syncingProgress; /** \brief Stack used to display various UI components. */ QStackedWidget *contentStack; /** \brief Dashboard used to display information about the player. */ PlayerDashboard *dashboard; /** \brief ParticipantsView used to display player participants. */ ParticipantsView *participantsView; /** \brief A flag indicating whether or not the client is in the process of quitting. */ bool isQuiting; /** * \brief A flag indicating whether or not the client is currently expeiriencing a hard * authentication failure. */ bool hasHardAuthFailure; #if IS_WINDOWS_BUILD qtsparkle::Updater* updater; #endif //@} /** @name Private Functions */ //@{ /** \brief Sets up all the MetaWindow's UI components. */ void setupUi(); /** \brief Sets up the MetaWindow's menus. */ void setupMenus(); /** \brief Creates the actions used in the MetaWindow */ void createActions(); /** \brief Configures the menu for changing player settings. */ void configurePlayerMenu(); /** \brief Determines whether or not the user had an iTunes library. */ bool hasItunesLibrary(); /** * \brief Attemps to add the given media sources to the library. * * \param musicToAdd A list of media sources to be added to the library. */ void addMediaSources(const QList& musicToAdd); /** * \brief Disconnects any signals that may have been setup at the beginning * of a library sync operation. */ void disconnectSyncSignals(); //@} }; } //end namespace #endif //METAWINDOW_HPP UDJ-Desktop-Client-0.6.4/src/PlayerCreationWidget.hpp0000664000175000017500000000547112051252546022012 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef PLAYER_CREATION_WIDGET_HPP #define PLAYER_CREATION_WIDGET_HPP #include "WidgetWithLoader.hpp" class QLineEdit; class QPushButton; class QLabel; class QGroupBox; namespace UDJ{ class DataStore; class AddressWidget; /** \brief Widget used to create a new player. */ class PlayerCreationWidget : public WidgetWithLoader{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a PlayerCreationWidget. * * @param dataStore The DataStore backing this instance of UDJ. * @param parent The parent widget. */ PlayerCreationWidget(DataStore *dataStore, QWidget *parent=0); //@} public slots: /** @name Public Slots */ //@{ /** \brief Attemps to create a new event */ void doCreation(); //@} signals: /** @name Signals */ //@{ /** \brief Emitted when a new player is created. */ void playerCreated(); /** \brief Emitted when creating a new player fails. */ void playerCreateFailed(); //@} private: /** @name Private Functions */ //@{ /** \brief Initilizes the UI */ void setupUi(); //@} /** @name Private Memeber */ //@{ /** \brief lineedit used to retrieve the name of the event */ QLineEdit *nameEdit; /** \brief lineedit used to the password of the event */ QLineEdit *passwordEdit; /** \brief Groupbox holding the address widget */ QGroupBox *addressGroup; /** \brief Lable to display instructions */ QLabel *createLabel; /** * \brief The data store containing music that could potentially be added * to the playlist. */ DataStore *dataStore; /** * \brief Widget for retrieving address information. */ AddressWidget *addressWidget; /** \brief From containing the inputs required for player creation. */ QWidget *playerForm; //@} private slots: /** @name Private Slots */ //@{ /** * \brief Executes appropriate actions after player has actually been created. */ void playerCreateSuccess(); /** * \brief Executes appropriate actions after player was failed to be created. */ void playerCreateFail(const QString& errMessage); //@} }; }//end namspace UDJ #endif //PLAYER_CREATION_WIDGET_HPP UDJ-Desktop-Client-0.6.4/src/ConfigDefs.hpp.in0000664000175000017500000000574212051252546020342 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef CONFIG_DEFS_HPP #define CONFIG_DEFS_HPP #define UDJ_WINDOWS_UPDATE_URL "http://www.udjplayer.com/windows/sparkle.xml" #define HAS_CUSTOM_CA_CERT @HAS_CUSTOM_CA_CERT@ #define IS_APPLE_BUILD @IS_APPLE_BUILD@ #define IS_WINDOWS_BUILD @IS_WINDOWS_BUILD@ #define UDJ_VERSION "@PROJECT_VERSION@" #include namespace UDJ{ typedef long library_song_id_t; typedef long player_id_t; typedef long user_id_t; typedef int lib_sync_status_t; } //end namespace #ifdef UDJ_DEBUG_BUILD #include #include #define EXEC_SQL( MESSAGE , STMT, QSQLOBJECT ) \ if(!( STMT )){ \ std::cerr << MESSAGE << " IN FILE " << __FILE__ << " AT LINE " \ << __LINE__ << std::endl; \ std::cerr << "SQL ERROR MESSAGE: '" << \ QSQLOBJECT.lastError().text().toStdString() << "'" << std::endl; \ std::cerr << "QUERY WAS: '" << QSQLOBJECT.lastQuery().toStdString() \ << "'" <(); \ } #define EXEC_BULK_QUERY( MESSAGE, QSQLOBJECT) \ if(!QSQLOBJECT.execBatch()){ \ std::cerr << MESSAGE << " IN FILE " << __FILE__ << " AT LINE " \ << __LINE__ << std::endl; \ std::cerr << "SQL ERROR MESSAGE: '" << \ QSQLOBJECT.lastError().text().toStdString() << "'" << std::endl; \ std::cerr << "QUERY WAS: '" << QSQLOBJECT.lastQuery().toStdString() \ << "'" <(); #define EXEC_BULK_QUERY( MESSAGE, QSQLOBJECT) \ QSQLOBJECT.execBatch(); #endif #endif //CONFIG_DEFS_HPP UDJ-Desktop-Client-0.6.4/src/AddressWidget.hpp0000664000175000017500000000475012051252546020455 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef ADDRESS_WIDGET_HPP #define ADDRESS_WIDGET_HPP #include #include class QLineEdit; class QComboBox; namespace UDJ{ /** \brief An input widget for getting addresses */ class AddressWidget : public QWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs an AddressWidget. * * @param parent The parent widget. * @param streetAddress The street address to be displayed. * @param city The city to be displayed. * @param state The state to be selected. * @param zipcode the current zipcode. */ AddressWidget( QWidget *parent=0, QString streetAddress="", QString city="", QString state="", QString zipcode="" ); //@} /** @name Getters */ //@{ QString getStreetAddress() const; QString getCity() const; QString getState() const; QString getZipcode() const; QString getBadInputs() const; //@} private: /** \brief LineEdit used to specify the street address of the player */ QLineEdit *streetAddressEdit; /** \brief LineEdit used to specify the city of the player */ QLineEdit *cityEdit; /** \brief ComboBox used to specify the state of the player */ QComboBox *stateCombo; /** \brief LineEdit used to specify the zipcode of the player */ QLineEdit *zipcodeEdit; /** * \brief Retrieves the regex for validating the zipcode. * * \return The regex for validating the zipcode. */ static const QRegExp& getZipcodeRegex(){ //We're keeping it simple for now. //static const QRegExp zipcodeRegex("^\\d{5}(-\\d{4})?$"); static const QRegExp zipcodeRegex("^\\d{5}$"); return zipcodeRegex; } /** \brief Sets up all the options for the state combo box. */ void setupStateCombo(const QString& selectedState); }; }//end namespace UDJ #endif //ADDRESS_WIDGET_HPP UDJ-Desktop-Client-0.6.4/src/LibraryWidget.hpp0000664000175000017500000000337612051252546020477 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef LIBRARY_WIDGET_HPP #define LIBRARY_WIDGET_HPP #include "ConfigDefs.hpp" #include class QLineEdit; namespace UDJ{ class DataStore; class LibraryView; /** * \brief Displays the Library and other widgets associated with the library. */ class LibraryWidget : public QWidget{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs a LibraryWidget * * @param dataStore The DataStore backing this instance of UDJ. * @param parent The parent widget. */ LibraryWidget(DataStore *dataStore, QWidget *parent=0); //@} /** @name Signals */ //@{ signals: /** \brief Emitted when the LibraryWidget believes the song library needs to be synced. */ void libNeedsSync(); //@} private: /** @name Private Members */ //@{ /** \brief The datastore backing the client. */ DataStore *dataStore; /** \brief The view used to display the library. */ LibraryView *libraryView; /** \brief A line edit used to search the library. */ QLineEdit *searchEdit; //@} }; }//end namespace UDJ #endif //LIBRARY_WIDGET_HPP UDJ-Desktop-Client-0.6.4/src/udj.rc0000664000175000017500000000005612051252546016316 0ustar kurtiskurtisIDI_ICON1 ICON DISCARDABLE "udjlauncher.ico" UDJ-Desktop-Client-0.6.4/src/DataStore.cpp0000664000175000017500000011152112051252546017600 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #include "DataStore.hpp" #include "UDJServerConnection.hpp" #include "Utils.hpp" #include "Logger.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace UDJ{ DataStore::DataStore( const QString& username, const QString& password, const QByteArray& ticket, const user_id_t& userId, QObject *parent) :QObject(parent), username(username), password(password), isReauthing(false), changingPlayerState(false), clearingCurrentSong(false), currentSongId(-1) { serverConnection = new UDJServerConnection(this); serverConnection->setTicket(ticket); serverConnection->setUserId(userId); QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); if(settings.contains(getPlayerIdSettingName())){ serverConnection->setPlayerId(settings.value(getPlayerIdSettingName()).value()); } activePlaylistRefreshTimer = new QTimer(this); activePlaylistRefreshTimer->setInterval(5000); participantRefreshTimer = new QTimer(this); participantRefreshTimer->setInterval(5000); setupDB(); connect(serverConnection, SIGNAL(playerStateSet(const QString&)), this, SLOT(onPlayerStateSet(const QString&))); connect( serverConnection, SIGNAL(playerStateSetError(const QString&, const QString&, int, const QList&)), this, SLOT(onPlayerStateSetError(const QString&, const QString&, int, const QList&))); connect( serverConnection, SIGNAL(playerPasswordSetError(const QString&, const QString&, int, const QList&)), this, SLOT(onPlayerPasswordSetError(const QString&, const QString&, int, const QList&))); connect( serverConnection, SIGNAL(playerLocationSetError(const QString&, int, const QList&)), this, SLOT(onPlayerLocationSetError(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(playerPasswordRemoveError(const QString&, int, const QList&)), this, SLOT(onPlayerPasswordRemoveError(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(libSongsSyncedToServer(const QSet&)), this, SLOT(setLibSongsSynced(const QSet&))); connect( serverConnection, SIGNAL(playerCreated(const player_id_t&)), this, SLOT(onPlayerCreate(const player_id_t&))); connect( serverConnection, SIGNAL(playerCreationFailed(const QString&, int, const QList&)), this, SLOT(onPlayerCreationFailed(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(newActivePlaylist(const QVariantMap&)), this, SLOT(setActivePlaylist(const QVariantMap&))); connect( serverConnection, SIGNAL(getActivePlaylistFail(const QString&, int, const QList&)), this, SLOT(onGetActivePlaylistFail(const QString&, int, const QList&))); connect(activePlaylistRefreshTimer, SIGNAL(timeout()), this, SLOT(refreshActivePlaylist())); connect( serverConnection, SIGNAL(currentSongSet()), this, SLOT(refreshActivePlaylist())); connect( participantRefreshTimer, SIGNAL(timeout()), this, SLOT(refreshParticipantList())); connect( serverConnection, SIGNAL(libModError(const QString&, int, const QList&)), this, SLOT(onLibModError(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(setCurrentSongFailed(const QString&, int, const QList&)), this, SLOT(onSetCurrentSongFailed(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(activePlaylistModified(const QSet&, const QSet&)), this, SLOT(onActivePlaylistModified(const QSet&, const QSet&))); connect( serverConnection, SIGNAL(activePlaylistModFailed(const QString&, int, const QList&)), this, SLOT(onActivePlaylistModFailed(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(setVolumeFailed(const QString&, int, const QList&)), this, SLOT(onSetVolumeFailed(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(authenticated(const QByteArray&, const user_id_t&)), this, SLOT(onReauth(const QByteArray&, const user_id_t&))); connect( serverConnection, SIGNAL(authFailed(const QString&)), this, SLOT(onAuthFail(const QString&))); connect( serverConnection, SIGNAL(currentSongCleared()), this, SLOT(onCurrentSongCleared())); connect( serverConnection, SIGNAL(currentSongClearError(const QString&, int, const QList&)), this, SLOT(onCurrentSongClearError(const QString&, int, const QList&))); connect( serverConnection, SIGNAL(newParticipantList(const QVariantList&)), this, SLOT(onNewParticipantList(const QVariantList&))); } void DataStore::setupDB(){ //TODO do all of this stuff in a seperate thread and return right away. QDir dbDir(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); if(!dbDir.exists()){ Logger::instance()->log("DB dir didn't exists. making it at : " + dbDir.absolutePath()); //TODO handle if this fails dbDir.mkpath(dbDir.absolutePath()); } QString dbFilePath = dbDir.absoluteFilePath(getPlayerDBName()); if(!QFile::exists(dbFilePath)){ Logger::instance()->log("DB file didn't exist, so creating it at: " + dbFilePath); QFile dbFile(dbFilePath); dbFile.open(QIODevice::WriteOnly); dbFile.close(); } database = QSqlDatabase::addDatabase("QSQLITE", getPlayerDBConnectionName()); database.setDatabaseName(dbFilePath); database.open(); QSqlQuery setupQuery(database); EXEC_SQL( "Error creating library table", setupQuery.exec(getCreateLibraryQuery()), setupQuery) EXEC_SQL( "Error creating activePlaylist table.", setupQuery.exec(getCreateActivePlaylistQuery()), setupQuery) EXEC_SQL( "Error creating activePlaylist view.", setupQuery.exec(getCreateActivePlaylistViewQuery()), setupQuery) } void DataStore::startPlaylistAutoRefresh(){ Logger::instance()->log("Starting playlist auto refresh"); activePlaylistRefreshTimer->start(); } void DataStore::startParticipantsAutoRefresh(){ Logger::instance()->log("Starting particpants auto refresh"); participantRefreshTimer->start(); } void DataStore::clearCurrentSong(){ currentSongId = -1; clearingCurrentSong = true; serverConnection->clearCurrentSong(); } void DataStore::onCurrentSongCleared(){ clearingCurrentSong = false; } void DataStore::onCurrentSongClearError( const QString& errMessage, int errorCode, const QList& headers) { if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(CLEAR_CURRENT_SONG); initReauth(); } else{ clearingCurrentSong = false; emit clearCurrentSongError(errMessage); } } void DataStore::onPlayerStateSet(const QString& state){ changingPlayerState = false; if(state == getInactiveState()){ emit playerSuccessfullySetInactive(); } } void DataStore::onPlayerStateSetError( const QString& state, const QString& errMessage, int errorCode, const QList& headers) { if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); if(state != getInactiveState()){ reauthActions.insert(SET_PLAYER_STATE); } else{ reauthActions.insert(SET_PLAYER_INACTIVE); } initReauth(); } else{ changingPlayerState = false; if(state == getPlayingState()){ emit playPlayerError(errMessage); } else if(state == getPausedState()){ emit pausePlayerError(errMessage); } else if(state == getInactiveState()){ emit playerSetInactiveError(errMessage); } } } void DataStore::removePlayerPassword(){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getHasPlayerPasswordSettingName(), false); serverConnection->removePlayerPassword(); emit playerPasswordRemoved(); } void DataStore::onPlayerPasswordRemoveError( const QString& errMessage, int errorCode, const QList& headers) { if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(REMOVE_PLAYER_PASSWORD); initReauth(); } else{ emit playerPasswordRemoveError(errMessage); } } void DataStore::setPlayerPassword(const QString& newPassword){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getHasPlayerPasswordSettingName(), true); serverConnection->setPlayerPassword(newPassword); emit playerPasswordSet(); } void DataStore::onPlayerPasswordSetError( const QString& attemptedPassword, const QString& errMessage, int errorCode, const QList& headers) { if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(SET_PLAYER_PASSWORD); reauthPlayerPassword = attemptedPassword; initReauth(); } else{ emit playerPasswordSetError(errMessage); } } void DataStore::setPlayerLocation( const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode ) { QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getAddressSettingName(), streetAddress); settings.setValue(getCitySettingName(), city); settings.setValue(getStateSettingName(), state); settings.setValue(getZipCodeSettingName(), zipcode); serverConnection->setPlayerLocation(streetAddress, city, state, zipcode); emit playerLocationSet(); } void DataStore::onPlayerLocationSetError( const QString& errMessage, int errorCode, const QList& headers) { if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(SET_PLAYER_LOCATION); initReauth(); } else{ //TODO handle location not found error emit playerLocationSetError(errMessage); } } void DataStore::pausePlayer(){ setPlayerState(getPausedState()); } void DataStore::playPlayer(){ setPlayerState(getPlayingState()); } void DataStore::setPlayerState(const QString& newState){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getPlayerStateSettingName(), newState); changingPlayerState = true; serverConnection->setPlayerState(newState); } void DataStore::setPlayerInactive(){ serverConnection->setPlayerState(getInactiveState()); } void DataStore::addMusicToLibrary( const QList& songs, QProgressDialog* progress) { bool isTransacting=database.transaction(); if(isTransacting){ Logger::instance()->log("Was able to start transaction"); } QSqlQuery addQuery(database); addQuery.prepare( "INSERT INTO "+getLibraryTableName()+ "("+ getLibSongColName() + ","+ getLibArtistColName() + ","+ getLibAlbumColName() + ","+ getLibGenreColName() + "," + getLibTrackColName() + "," + getLibFileColName() + "," + getLibDurationColName() +")" + "VALUES ( :song , :artist , :album , :genre, :track, :file, :duration );" ); for(int i =0; isetValue(i); if(progress->wasCanceled()){ if(isTransacting){ Logger::instance()->log("Rolling back transaction"); if(!database.rollback()){ Logger::instance()->log("Roll back failed"); } } return; } } } if(isTransacting){ Logger::instance()->log("Committing add transaction"); database.commit(); } } void DataStore::addSongToLibrary(const Phonon::MediaSource& song, QSqlQuery &addQuery){ QString fileName = song.fileName(); QString songName; QString artistName; QString albumName; QString genre; int track; int duration; TagLib::FileRef f(fileName.toStdString().c_str()); if(!f.isNull() && f.tag() && f.audioProperties()){ TagLib::Tag *tag = f.tag(); songName = TStringToQString(tag->title()); artistName = TStringToQString(tag->artist()); albumName = TStringToQString(tag->album()); genre = TStringToQString(tag->genre()); duration = f.audioProperties()->length(); track = tag->track(); } else{ //TODO throw error return; } if(songName == ""){ songName = unknownSongTitle(); } if(artistName == ""){ artistName = unknownSongArtist(); } if(albumName == ""){ albumName = unknownSongAlbum(); } if(genre == ""){ genre = unknownGenre(); } Logger::instance()->log("adding song with title: " + songName + " to database"); library_song_id_t hostId =-1; addQuery.bindValue(":song", songName); addQuery.bindValue(":artist", artistName); addQuery.bindValue(":album", albumName); addQuery.bindValue(":genre", genre); addQuery.bindValue(":track", track); addQuery.bindValue(":file", fileName); addQuery.bindValue(":duration", duration); EXEC_INSERT( "Failed to add song library" << songName.toStdString(), addQuery, hostId, library_song_id_t) } bool DataStore::alreadyHaveSongInLibrary(const QString& fileName) const{ QSqlQuery existsQuery(database); existsQuery.prepare( "SELECT * FROM "+getLibraryTableName()+ " WHERE " + getLibIsDeletedColName() + "=0 and " + getLibFileColName() + "=\""+fileName+"\";" ); EXEC_SQL( "Error executing already in library test query", existsQuery.exec(), existsQuery) return existsQuery.next(); } void DataStore::removeSongsFromLibrary(const QSet& toRemove, QProgressDialog* progress) { bool isTransacting = database.transaction(); QSqlQuery deleteQuery(database); deleteQuery.prepare("UPDATE " + getLibraryTableName() + " " "SET " + getLibIsDeletedColName() + "=1, "+ getLibSyncStatusColName() + "=" + QString::number(getLibNeedsDeleteSyncStatus()) + " " "WHERE " + getLibIdColName() + "= ?"); int i=0; Q_FOREACH(library_song_id_t id, toRemove){ deleteQuery.bindValue(0, QVariant::fromValue(id)); EXEC_SQL( "Error setting song sync status", deleteQuery.exec(), deleteQuery) if(progress != NULL){ progress->setValue(i); if(progress->wasCanceled()){ if(isTransacting){ database.rollback(); } break; } } ++i; } if(isTransacting){ database.commit(); } } void DataStore::addSongToActivePlaylist(library_song_id_t libraryId){ QSet libIds; libIds.insert(libraryId); addSongsToActivePlaylist(libIds); } void DataStore::addSongsToActivePlaylist(const QSet& libIds){ playlistIdsToAdd.unite(libIds); QSet emptySet; serverConnection->modActivePlaylist(libIds, emptySet); } void DataStore::removeSongsFromActivePlaylist(const QSet& libIds){ playlistIdsToRemove.unite(libIds); QSet emptySet; serverConnection->modActivePlaylist(emptySet, libIds); } QSqlDatabase DataStore::getDatabaseConnection(){ QSqlDatabase toReturn = QSqlDatabase::database(getPlayerDBConnectionName()); return toReturn; } Phonon::MediaSource DataStore::getNextSongToPlay(){ QSqlQuery nextSongQuery("SELECT " + getLibFileColName() + " FROM " + getActivePlaylistViewName() + " LIMIT 1;"); EXEC_SQL( "Getting next song failed", nextSongQuery.exec(), nextSongQuery) //TODO handle is this returns false if(nextSongQuery.first()){ return Phonon::MediaSource(nextSongQuery.value(0).toString()); } else{ return Phonon::MediaSource(""); } } DataStore::song_info_t DataStore::takeNextSongToPlay(){ QSqlQuery nextSongQuery( "SELECT " + getLibFileColName() + ", " + getLibSongColName() + ", " + getLibArtistColName() + ", " + getLibDurationColName() + ", " + getActivePlaylistLibIdColName() +" FROM " + getActivePlaylistViewName() + " LIMIT 1;", database); EXEC_SQL( "Getting next song in take failed", nextSongQuery.exec(), nextSongQuery) nextSongQuery.next(); if(!nextSongQuery.isValid()){ song_info_t toReturn = {Phonon::MediaSource(""), "", "", "" }; return toReturn; } currentSongId = nextSongQuery.value(4).value(); deleteSongFromPlaylist(currentSongId); Logger::instance()->log("Setting current song with id: " + QString::number(currentSongId)); serverConnection->setCurrentSong(currentSongId); QString filePath = nextSongQuery.value(0).toString(); QTime qtime(0, nextSongQuery.value(3).toInt()/60, nextSongQuery.value(3).toInt()%60); song_info_t toReturn = { Phonon::MediaSource(filePath), nextSongQuery.value(1).toString(), nextSongQuery.value(2).toString(), qtime.toString("mm:ss") }; return toReturn; } void DataStore::deleteSongFromPlaylist(library_song_id_t toDelete){ QSqlQuery deleteSongQuery( "DELETE FROM " + getActivePlaylistTableName() + " WHERE " + getActivePlaylistLibIdColName() + " = " + QString::number(toDelete) + ";", database); EXEC_SQL( "Deleting song from playlist failed", deleteSongQuery.exec(), deleteSongQuery) } void DataStore::setCurrentSong(const library_song_id_t& songToPlay){ QSqlQuery getSongQuery( "SELECT " + getLibFileColName() + ", " + getLibSongColName() + ", " + getLibArtistColName() + ", " + getLibDurationColName() + " FROM " + getActivePlaylistViewName() + " WHERE " + getActivePlaylistLibIdColName() + " = " + QString::number(songToPlay) + ";", database); EXEC_SQL( "Getting song for manual playlist set failed.", getSongQuery.exec(), getSongQuery) getSongQuery.next(); if(getSongQuery.isValid()){ Logger::instance()->log("Got file, for manual song set"); QString filePath = getSongQuery.value(0).toString(); currentSongId = songToPlay; serverConnection->setCurrentSong(songToPlay); Logger::instance()->log("Retrieved Artist " + getSongQuery.value(2).toString()); QTime qtime(0, getSongQuery.value(3).toInt()/60, getSongQuery.value(3).toInt()%60); song_info_t toEmit = { Phonon::MediaSource(filePath), getSongQuery.value(1).toString(), getSongQuery.value(2).toString(), qtime.toString("mm:ss") }; emit manualSongChange(toEmit); } } void DataStore::createNewPlayer( const QString& name, const QString& password) { QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getPlayerNameSettingName(), name); settings.setValue(getHasPlayerPasswordSettingName(), true); serverConnection->createPlayer(name, password); } void DataStore::createNewPlayer( const QString& name, const QString& password, const QString& streetAddress, const QString& city, const QString& state, const QString& zipcode) { QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getPlayerNameSettingName(), name); settings.setValue(getHasPlayerPasswordSettingName(), true); settings.setValue(getAddressSettingName(), streetAddress); settings.setValue(getCitySettingName(), city); settings.setValue(getStateSettingName(), state); settings.setValue(getZipCodeSettingName(), zipcode); serverConnection->createPlayer( name, password, streetAddress, city, state, zipcode); } void DataStore::setVolume(qreal newVolume){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); Logger::instance()->log("Current volume " + QString::number(settings.value(getPlayerVolumeSettingName()).toReal())); Logger::instance()->log("New volume " + QString::number(newVolume)); if((int)(settings.value(getPlayerVolumeSettingName()).toReal()*10) != (int)(newVolume*10)){ Logger::instance()->log("Volume was different than current volume, now setting"); settings.setValue(getPlayerVolumeSettingName(), newVolume); serverConnection->setVolume((int)(newVolume * 10)); } } void DataStore::syncLibrary(){ QSqlQuery needAddSongs(database); Logger::instance()->log("batching up sync"); EXEC_SQL( "Error querying for song to add", needAddSongs.exec( "SELECT * FROM " + getLibraryTableName() + " WHERE " + getLibSyncStatusColName() + "==" + QString::number(getLibNeedsAddSyncStatus()) + " LIMIT 100;"), needAddSongs) QVariantList songsToAdd; QSqlRecord currentRecord; while(needAddSongs.next()){ currentRecord = needAddSongs.record(); QVariantMap songToAdd; songToAdd["id"] = currentRecord.value(getLibIdColName()).toString(); QString title = currentRecord.value(getLibSongColName()).toString(); title.truncate(199); songToAdd["title"] = title; QString artist = currentRecord.value(getLibArtistColName()).toString(); artist.truncate(199); songToAdd["artist"] = artist; QString album = currentRecord.value(getLibAlbumColName()).toString(); album.truncate(199); songToAdd["album"] = album; songToAdd["duration"] = currentRecord.value(getLibDurationColName()); songToAdd["track"] = currentRecord.value(getLibTrackColName()).toInt(); QString genre = currentRecord.value(getLibGenreColName()).toString(); genre.truncate(49); songToAdd["genre"] = genre; songsToAdd.append(songToAdd); } QSqlQuery needDeleteSongs(database); EXEC_SQL( "Error querying for songs to delete", needDeleteSongs.exec( "SELECT * FROM " + getLibraryTableName() + " WHERE " + getLibSyncStatusColName() + "==" + QString::number(getLibNeedsDeleteSyncStatus()) + " LIMIT 100;"), needDeleteSongs) QVariantList songsToDelete; while(needDeleteSongs.next()){ currentRecord = needDeleteSongs.record(); songsToDelete.append(currentRecord.value(getLibIdColName()).toString()); } Logger::instance()->log("Found " + QString::number(songsToDelete.size()) + " songs which need deleting"); Logger::instance()->log("Found " + QString::number(songsToAdd.size()) + " songs which need adding"); if(songsToDelete.size() > 0 || songsToAdd.size() > 0){ serverConnection->modLibContents(songsToAdd, songsToDelete); } } void DataStore::setLibSongSynced(library_song_id_t song){ QSet songSet; songSet.insert(song); setLibSongsSynced(songSet); } void DataStore::setLibSongsSynced(const QSet& songs){ setLibSongsSyncStatus(songs, getLibIsSyncedStatus()); } void DataStore::setLibSongsSyncStatus( const QSet& songs, const lib_sync_status_t syncStatus) { Logger::instance()->log("Setting songs to synced"); bool isTransacting = database.transaction(); QSqlQuery syncQuery(database); syncQuery.prepare("UPDATE " + getLibraryTableName() + " " "SET " + getLibSyncStatusColName() + "=" + QString::number(syncStatus) + " " "WHERE " + getLibIdColName() + "= ?"); Q_FOREACH(library_song_id_t id, songs){ syncQuery.bindValue(0, QVariant::fromValue(id)); EXEC_SQL( "Error setting song sync status", syncQuery.exec(), syncQuery) QSet modId; modId.insert(id); emit libSongsModified(modId); } if(isTransacting){ database.commit(); } if(hasUnsyncedSongs()){ Logger::instance()->log("more stuff to sync"); syncLibrary(); } else{ emit allSynced(); Logger::instance()->log("syncing done"); } } bool DataStore::hasUnsyncedSongs() const{ return getTotalUnsynced() != 0; } int DataStore::getTotalUnsynced() const{ QSqlQuery unsyncedQuery(database); EXEC_SQL( "Error querying for unsynced songs", unsyncedQuery.exec( "SELECT COUNT(*) FROM " + getLibraryTableName() + " WHERE " + getLibSyncStatusColName() + "!=" + QString::number(getLibIsSyncedStatus()) + ";"), unsyncedQuery) if(unsyncedQuery.next()){ return unsyncedQuery.record().value(0).toInt(); } else{ return 0; } } void DataStore::clearActivePlaylist(){ QSqlQuery deleteActivePlayilstQuery(database); EXEC_SQL( "Error clearing active playlist table.", deleteActivePlayilstQuery.exec(getClearActivePlaylistQuery()), deleteActivePlayilstQuery) } void DataStore::addSong2ActivePlaylistFromQVariant( const QVariantMap &songToAdd, int priority) { QSqlQuery addQuery( "INSERT INTO "+getActivePlaylistTableName()+ "("+ getActivePlaylistLibIdColName() + ","+ getDownVoteColName() + ","+ getUpVoteColName() + "," + getPriorityColName() + "," + getTimeAddedColName() +"," + getAdderUsernameColName() +"," + getAdderIdColName() + ")" + " VALUES ( :libid , :down , :up, :pri , :time , :username, :adder );", database); addQuery.bindValue(":libid", songToAdd["song"].toMap()["id"]); addQuery.bindValue(":down", songToAdd["downvoters"].toList().size()); addQuery.bindValue(":up", songToAdd["upvoters"].toList().size()); addQuery.bindValue(":pri", priority); addQuery.bindValue(":time", songToAdd["time_added"]); addQuery.bindValue(":username", songToAdd["adder"].toMap()["username"]); addQuery.bindValue(":adder", songToAdd["adder"].toMap()["id"]); long insertId; EXEC_INSERT( "Failed to add song library" << songToAdd["song"].toString().toStdString(), addQuery, insertId, long) } void DataStore::setActivePlaylist(const QVariantMap& newPlaylist){ int retrievedVolume = newPlaylist["volume"].toInt(); if(retrievedVolume != (int)(getPlayerVolume()*10)){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getPlayerVolumeSettingName(), retrievedVolume/10.0); emit volumeChanged(retrievedVolume/10.0); } QString retrievedState = newPlaylist["state"].toString(); if(!changingPlayerState && retrievedState != getPlayerState()){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getPlayerStateSettingName(), retrievedState); emit playerStateChanged(retrievedState); } library_song_id_t retrievedCurrentId = newPlaylist["current_song"].toMap()["song"].toMap()["id"].value(); if(retrievedCurrentId != currentSongId && !clearingCurrentSong){ QSqlQuery getSongQuery( "SELECT " + getLibFileColName() + ", " + getLibSongColName() + ", " + getLibArtistColName() + ", " + getLibDurationColName() + " FROM " + getActivePlaylistViewName() + " WHERE " + getActivePlaylistLibIdColName() + " = " + QString::number(retrievedCurrentId) + ";", database); EXEC_SQL( "Getting song for manual playlist set failed.", getSongQuery.exec(), getSongQuery) getSongQuery.next(); if(getSongQuery.isValid()){ Logger::instance()->log("Got file, for manual song set"); QString filePath = getSongQuery.value(0).toString(); currentSongId = retrievedCurrentId; QTime qtime(0, getSongQuery.value(3).toInt()/60, getSongQuery.value(3).toInt()%60); song_info_t toEmit = { Phonon::MediaSource(filePath), getSongQuery.value(1).toString(), getSongQuery.value(2).toString(), qtime.toString("mm:ss") }; emit manualSongChange(toEmit); } } clearActivePlaylist(); QVariantList newSongs = newPlaylist["active_playlist"].toList(); for(int i=0; i& headers) { Logger::instance()->log("Playlist error: " + QString::number(errorCode) + " " + errMessage); if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(GET_ACTIVE_PLAYLIST); initReauth(); } //TODO handle other possible errors? } void DataStore::onActivePlaylistModified( const QSet& added, const QSet& removed) { playlistIdsToAdd.subtract(added); playlistIdsToRemove.subtract(removed); refreshActivePlaylist(); } void DataStore::onActivePlaylistModFailed( const QString& /*errMessage*/, int errorCode, const QList& headers) { Logger::instance()->log("Active playlist mod failed with code " + QString::number(errorCode)); if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(MOD_PLAYLIST); initReauth(); } //TODO do stuff on failure } void DataStore::refreshActivePlaylist(){ serverConnection->getActivePlaylist(); } void DataStore::refreshParticipantList(){ serverConnection->getParticipantList(); } void DataStore::onPlayerCreate(const player_id_t& issuedId){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getPlayerIdSettingName(), QVariant::fromValue(issuedId)); serverConnection->setPlayerId(issuedId); emit playerCreated(); } void DataStore::onPlayerCreationFailed(const QString& errMessage, int /*errorCode*/, const QList& /*headers*/) { //TODO do other stuff as well. like do reauth emit playerCreationFailed(errMessage); } void DataStore::onLibModError( const QString& errMessage, int errorCode, const QList& headers) { Logger::instance()->log("Got bad libmod " + QString::number(errorCode)); if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(SYNC_LIB); initReauth(); } else{ Logger::instance()->log("Bad lib mod message " + errMessage); emit libModError(errMessage); } } void DataStore::onSetCurrentSongFailed( const QString& errMessage, int errorCode, const QList& headers) { Logger::instance()->log("Setting current song failed: " + QString::number(errorCode) + " " + errMessage); if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(SET_CURRENT_SONG); initReauth(); } } void DataStore::onSetVolumeFailed( const QString& errMessage, int errorCode, const QList& headers) { Logger::instance()->log("Setting volume failed " + QString::number(errorCode) + " " + errMessage); if(isTicketAuthError(errorCode, headers)){ Logger::instance()->log("Got the ticket-hash challenge"); reauthActions.insert(SET_CURRENT_VOLUME); initReauth(); } else{ emit setVolumeError(errMessage); } } void DataStore::onNewParticipantList(const QVariantList& newParticipants){ emit newParticipantList(newParticipants); } void DataStore::onReauth(const QByteArray& ticketHash, const user_id_t& userId){ Logger::instance()->log("in on reauth"); isReauthing=false; serverConnection->setTicket(ticketHash); serverConnection->setUserId(userId); Q_FOREACH(ReauthAction r, reauthActions){ doReauthAction(r); } reauthActions.clear(); } void DataStore::doReauthAction(const ReauthAction& action){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); switch(action){ case SYNC_LIB: syncLibrary(); break; case GET_ACTIVE_PLAYLIST: refreshActivePlaylist(); break; case SET_CURRENT_SONG: if(currentSongId != -1){ serverConnection->setCurrentSong(currentSongId); } break; case MOD_PLAYLIST: serverConnection->modActivePlaylist(playlistIdsToAdd, playlistIdsToRemove); break; case SET_CURRENT_VOLUME: serverConnection->setVolume((int)(getPlayerVolume() * 10)); break; case SET_PLAYER_STATE: serverConnection->setPlayerState(getPlayerState()); break; case SET_PLAYER_INACTIVE: serverConnection->setPlayerState(getInactiveState()); break; case SET_PLAYER_LOCATION: serverConnection->setPlayerLocation( settings.value(getAddressSettingName()).toString(), settings.value(getCitySettingName()).toString(), settings.value(getStateSettingName()).toString(), settings.value(getZipCodeSettingName()).toString()); break; case SET_PLAYER_PASSWORD: serverConnection->setPlayerPassword(reauthPlayerPassword); reauthPlayerPassword=""; break; case REMOVE_PLAYER_PASSWORD: serverConnection->removePlayerPassword(); break; case CLEAR_CURRENT_SONG: serverConnection->clearCurrentSong(); break; } } void DataStore::onAuthFail(const QString& /*errMessage*/){ Logger::instance()->log("BAD STUFF, BAD AUTH CREDS, BAD REAUTH"); setPasswordDirty(); emit hardAuthFailure(); } void DataStore::initReauth(){ if(!isReauthing){ isReauthing=true; serverConnection->authenticate(getUsername(), getPassword()); } } QByteArray DataStore::getHeaderValue( const QByteArray& headerName, const QList& headers) { //Yes yes, I know this is an O(n) search. But it's fine. //This list of headers shouldn't be that long. Q_FOREACH(const QNetworkReply::RawHeaderPair& pair, headers){ if(headerName == pair.first){ return pair.second; } } return ""; } bool DataStore::getDontShowPlaybackErrorSetting(){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getDontShowPlaybackErrorSettingName(), false ).toBool(); } void DataStore::setDontShowPlaybackError(bool checked){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getDontShowPlaybackErrorSettingName(), checked); } void DataStore::saveUsername(const QString& username){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); SimpleCrypt crypt = Utils::getCryptoObject(); QString cryptUsername = crypt.encryptToString(username); settings.setValue(getUsernameSettingName(), cryptUsername); } QString DataStore::getSavedUsername(){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); SimpleCrypt crypt = Utils::getCryptoObject(); QString encryptedUsername = settings.value(getUsernameSettingName()).toString(); return encryptedUsername == "" ? "" : crypt.decryptToString(encryptedUsername); } void DataStore::savePassword(const QString& password) { QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); SimpleCrypt crypt = Utils::getCryptoObject(); QString cryptPassword = crypt.encryptToString(password); settings.setValue(getHasValidSavedPasswordSettingName(), true); settings.setValue(getPasswordSettingName(), cryptPassword); } void DataStore::setPasswordDirty(){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getHasValidSavedPasswordSettingName(), false); } bool DataStore::hasValidSavedPassword(){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); return settings.value(getHasValidSavedPasswordSettingName()).toBool(); } QString DataStore::getSavedPassword(){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); SimpleCrypt crypt = Utils::getCryptoObject(); QString encryptedPassword = settings.value(getPasswordSettingName()).toString(); return crypt.decryptToString(encryptedPassword); } void DataStore::clearSavedPassword(){ QSettings settings(QSettings::UserScope, getSettingsOrg(), getSettingsApp()); settings.setValue(getHasValidSavedPasswordSettingName(), false); settings.setValue(getPasswordSettingName(), ""); } } //end namespace UDJ-Desktop-Client-0.6.4/src/Utils.hpp0000664000175000017500000000454612051252546017027 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef UTILS_HPP #define UTILS_HPP #include #include #include #include #include #include "simpleCrypt/simplecrypt.h" namespace UDJ{ namespace Utils{ /** * Get's the ids currently selected in a view by * getting them from the model (and or proxy model) backing the view. * * \param view The view whose selected ids are in question. * \param model The model contaning the ids. * \param colName The name of the id column in the model. * \param proxyModel A proxy model being used by the view. */ template QSet getSelectedIds( const QTableView* view, const QSqlQueryModel* model, const QString& colName, const QSortFilterProxyModel *proxyModel=0) { QModelIndexList selected = view->selectionModel()->selectedIndexes(); QSet selectedIds; std::set rows; for( QModelIndexList::const_iterator it = selected.begin(); it != selected.end(); ++it ) { rows.insert( (proxyModel ? proxyModel->mapToSource(*it).row() : it->row()) ); } for( std::set::const_iterator it = rows.begin(); it != rows.end(); ++it ) { QSqlRecord selectedRecord = model->record(*it); selectedIds.insert( selectedRecord.value(colName).value()); } return selectedIds; } /** * Retrieves a cryptographic object that can be used to encrypt * sensitive material on the users local disk, which can then be * unencrypted later. * * @return A SimpleCrypt object that can be used to encrypt and decrypt * information on the user's local disk. */ SimpleCrypt getCryptoObject(); } //end namespace utils } //end namespae UDJ #endif //UTILS_HPP UDJ-Desktop-Client-0.6.4/src/ActivePlaylistView.hpp0000664000175000017500000000757412051252546021523 0ustar kurtiskurtis/** * Copyright 2011 Kurtis L. Nusbaum * * This file is part of UDJ. * * UDJ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * UDJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with UDJ. If not, see . */ #ifndef ACTIVE_PLAYLIST_VIEW_HPP #define ACTIVE_PLAYLIST_VIEW_HPP #include "ConfigDefs.hpp" #include #include "DataStore.hpp" class QAction; namespace UDJ{ class ActivePlaylistModel; /** * \brief A class used to dislay the active playlist. */ class ActivePlaylistView : public QTableView{ Q_OBJECT public: /** @name Constructors */ //@{ /** * \brief Constructs an ActivePlaylistView * * @param dataStore The DataStore backing this instance of UDJ. * @param parent The parent widget. */ ActivePlaylistView(DataStore* dataStore, QWidget* parent=0); //@} protected: /** @name Overridden From QTableView */ //@{ /** \brief . */ void focusOutEvent(QFocusEvent *event); //@} private: /** @name Private Functions */ //@{ /** * \brief Initializes actions used in the ActivePlaylistView */ void createActions(); /** @name Private Members */ //@{ /** * \brief The data store containing music that could potentially be added * to the playlist. */ DataStore* dataStore; /** * \brief The ActivePlaylistModel backing the view. */ ActivePlaylistModel *model; /** * \brief Action used to remove songs from the active playlist. */ QAction *removeSongAction; //@} /** @name Private Slots */ //@{ private slots: /** * \brief Takes the given index, identifies the song it corresponds to, * and sets that as the current song being played. * * @param index The model index of the playlist entry that should be set * as the currenty song. */ void setCurrentSong(const QModelIndex& index); /** * \brief Displays a context menu at the specified point. * * @param pos The position on the screen where the context menu should be shown. */ void handleContextMenuRequest(const QPoint& pos); /** * \brief Performs appropriate actions when the selection of the view has changed. * * @param selected Items that became selected. * @param deslsected Items that became deselected. */ void handleSelectionChange( const QItemSelection &selected, const QItemSelection &deselected); /** * \brief Removes all the currently selected songs from the active playlist. */ void removeSongs(); //@} /** @name Private Functions */ //@{ /** * \brief Configures how the headers in the view should look. */ void configureHeaders(); /** * \brief Gets the query that should be used to obtain the data to display. * * @return The query that should be used to obtain the data to display. */ static const QString& getDataQuery(){ static const QString dataQuery = "SELECT " + DataStore::getActivePlaylistLibIdColName() + ", " + DataStore::getLibSongColName() + ", " + DataStore::getLibArtistColName() + ", " + DataStore::getLibAlbumColName() + ", " + DataStore::getUpVoteColName() + ", " + DataStore::getDownVoteColName() + ", " + DataStore::getLibDurationColName() + ", " + DataStore::getAdderUsernameColName() + ", " + DataStore::getTimeAddedColName() + " FROM " + DataStore::getActivePlaylistViewName() + ";"; return dataQuery; } //@} }; } //end namespace #endif //ACTIVE_PLAYLIST_VIEW_HPP UDJ-Desktop-Client-0.6.4/src/simpleCrypt/0000775000175000017500000000000012051252546017520 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/src/simpleCrypt/simplecrypt.h0000664000175000017500000002341612051252546022252 0ustar kurtiskurtis/* Copyright (c) 2011, Andre Somers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Rathenau Instituut, Andre Somers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANDRE SOMERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SIMPLECRYPT_H #define SIMPLECRYPT_H #include #include #include /** @short Simple encryption and decryption of strings and byte arrays This class provides a simple implementation of encryption and decryption of strings and byte arrays. @warning The encryption provided by this class is NOT strong encryption. It may help to shield things from curious eyes, but it will NOT stand up to someone determined to break the encryption. Don't say you were not warned. The class uses a 64 bit key. Simply create an instance of the class, set the key, and use the encryptToString() method to calculate an encrypted version of the input string. To decrypt that string again, use an instance of SimpleCrypt initialized with the same key, and call the decryptToString() method with the encrypted string. If the key matches, the decrypted version of the string will be returned again. If you do not provide a key, or if something else is wrong, the encryption and decryption function will return an empty string or will return a string containing nonsense. lastError() will return a value indicating if the method was succesful, and if not, why not. SimpleCrypt is prepared for the case that the encryption and decryption algorithm is changed in a later version, by prepending a version identifier to the cypertext. */ class SimpleCrypt { public: /** CompressionMode describes if compression will be applied to the data to be encrypted. */ enum CompressionMode { CompressionAuto, /*!< Only apply compression if that results in a shorter plaintext. */ CompressionAlways, /*!< Always apply compression. Note that for short inputs, a compression may result in longer data */ CompressionNever /*!< Never apply compression. */ }; /** IntegrityProtectionMode describes measures taken to make it possible to detect problems with the data or wrong decryption keys. Measures involve adding a checksum or a cryptograhpic hash to the data to be encrypted. This increases the length of the resulting cypertext, but makes it possible to check if the plaintext appears to be valid after decryption. */ enum IntegrityProtectionMode { ProtectionNone, /*!< The integerity of the encrypted data is not protected. It is not really possible to detect a wrong key, for instance. */ ProtectionChecksum,/*!< A simple checksum is used to verify that the data is in order. If not, an empty string is returned. */ ProtectionHash /*!< A cryptographic hash is used to verify the integrity of the data. This method produces a much stronger, but longer check */ }; /** Error describes the type of error that occured. */ enum Error { ErrorNoError, /*!< No error occurred. */ ErrorNoKeySet, /*!< No key was set. You can not encrypt or decrypt without a valid key. */ ErrorUnknownVersion, /*!< The version of this data is unknown, or the data is otherwise not valid. */ ErrorIntegrityFailed, /*!< The integrity check of the data failed. Perhaps the wrong key was used. */ }; /** Constructor. Constructs a SimpleCrypt instance without a valid key set on it. */ SimpleCrypt(); /** Constructor. Constructs a SimpleCrypt instance and initializes it with the given @arg key. */ explicit SimpleCrypt(quint64 key); /** (Re-) initializes the key with the given @arg key. */ void setKey(quint64 key); /** Returns true if SimpleCrypt has been initialized with a key. */ bool hasKey() const {return !m_keyParts.isEmpty();} /** Sets the compression mode to use when encrypting data. The default mode is Auto. Note that decryption is not influenced by this mode, as the decryption recognizes what mode was used when encrypting. */ void setCompressionMode(CompressionMode mode) {m_compressionMode = mode;} /** Returns the CompressionMode that is currently in use. */ CompressionMode compressionMode() const {return m_compressionMode;} /** Sets the integrity mode to use when encrypting data. The default mode is Checksum. Note that decryption is not influenced by this mode, as the decryption recognizes what mode was used when encrypting. */ void setIntegrityProtectionMode(IntegrityProtectionMode mode) {m_protectionMode = mode;} /** Returns the IntegrityProtectionMode that is currently in use. */ IntegrityProtectionMode integrityProtectionMode() const {return m_protectionMode;} /** Returns the last error that occurred. */ Error lastError() const {return m_lastError;} /** Encrypts the @arg plaintext string with the key the class was initialized with, and returns a cyphertext the result. The result is a base64 encoded version of the binary array that is the actual result of the string, so it can be stored easily in a text format. */ QString encryptToString(const QString& plaintext) ; /** Encrypts the @arg plaintext QByteArray with the key the class was initialized with, and returns a cyphertext the result. The result is a base64 encoded version of the binary array that is the actual result of the encryption, so it can be stored easily in a text format. */ QString encryptToString(QByteArray plaintext) ; /** Encrypts the @arg plaintext string with the key the class was initialized with, and returns a binary cyphertext in a QByteArray the result. This method returns a byte array, that is useable for storing a binary format. If you need a string you can store in a text file, use encryptToString() instead. */ QByteArray encryptToByteArray(const QString& plaintext) ; /** Encrypts the @arg plaintext QByteArray with the key the class was initialized with, and returns a binary cyphertext in a QByteArray the result. This method returns a byte array, that is useable for storing a binary format. If you need a string you can store in a text file, use encryptToString() instead. */ QByteArray encryptToByteArray(QByteArray plaintext) ; /** Decrypts a cyphertext string encrypted with this class with the set key back to the plain text version. If an error occured, such as non-matching keys between encryption and decryption, an empty string or a string containing nonsense may be returned. */ QString decryptToString(const QString& cyphertext) ; /** Decrypts a cyphertext string encrypted with this class with the set key back to the plain text version. If an error occured, such as non-matching keys between encryption and decryption, an empty string or a string containing nonsense may be returned. */ QByteArray decryptToByteArray(const QString& cyphertext) ; /** Decrypts a cyphertext binary encrypted with this class with the set key back to the plain text version. If an error occured, such as non-matching keys between encryption and decryption, an empty string or a string containing nonsense may be returned. */ QString decryptToString(QByteArray cypher) ; /** Decrypts a cyphertext binary encrypted with this class with the set key back to the plain text version. If an error occured, such as non-matching keys between encryption and decryption, an empty string or a string containing nonsense may be returned. */ QByteArray decryptToByteArray(QByteArray cypher) ; //enum to describe options that have been used for the encryption. Currently only one, but //that only leaves room for future extensions like adding a cryptographic hash... enum CryptoFlag{CryptoFlagNone = 0, CryptoFlagCompression = 0x01, CryptoFlagChecksum = 0x02, CryptoFlagHash = 0x04 }; Q_DECLARE_FLAGS(CryptoFlags, CryptoFlag); private: void splitKey(); quint64 m_key; QVector m_keyParts; CompressionMode m_compressionMode; IntegrityProtectionMode m_protectionMode; Error m_lastError; }; Q_DECLARE_OPERATORS_FOR_FLAGS(SimpleCrypt::CryptoFlags) #endif // SimpleCrypt_H UDJ-Desktop-Client-0.6.4/src/simpleCrypt/simplecrypt.cpp0000664000175000017500000002060312051252546022600 0ustar kurtiskurtis /* Copyright (c) 2011, Andre Somers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Rathenau Instituut, Andre Somers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANDRE SOMERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "simplecrypt.h" #include #include #include #include #include SimpleCrypt::SimpleCrypt(): m_key(0), m_compressionMode(CompressionAuto), m_protectionMode(ProtectionChecksum), m_lastError(ErrorNoError) { qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF)); } SimpleCrypt::SimpleCrypt(quint64 key): m_key(key), m_compressionMode(CompressionAuto), m_protectionMode(ProtectionChecksum), m_lastError(ErrorNoError) { qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF)); splitKey(); } void SimpleCrypt::setKey(quint64 key) { m_key = key; splitKey(); } void SimpleCrypt::splitKey() { m_keyParts.clear(); m_keyParts.resize(8); for (int i=0;i<8;i++) { quint64 part = m_key; for (int j=i; j>0; j--) part = part >> 8; part = part & 0xff; m_keyParts[i] = static_cast(part); } } QByteArray SimpleCrypt::encryptToByteArray(const QString& plaintext) { QByteArray plaintextArray = plaintext.toUtf8(); return encryptToByteArray(plaintextArray); } QByteArray SimpleCrypt::encryptToByteArray(QByteArray plaintext) { if (m_keyParts.isEmpty()) { qWarning() << "No key set."; m_lastError = ErrorNoKeySet; return QByteArray(); } QByteArray ba = plaintext; CryptoFlags flags = CryptoFlagNone; if (m_compressionMode == CompressionAlways) { ba = qCompress(ba, 9); //maximum compression flags |= CryptoFlagCompression; } else if (m_compressionMode == CompressionAuto) { QByteArray compressed = qCompress(ba, 9); if (compressed.count() < ba.count()) { ba = compressed; flags |= CryptoFlagCompression; } } QByteArray integrityProtection; if (m_protectionMode == ProtectionChecksum) { flags |= CryptoFlagChecksum; QDataStream s(&integrityProtection, QIODevice::WriteOnly); s << qChecksum(ba.constData(), ba.length()); } else if (m_protectionMode == ProtectionHash) { flags |= CryptoFlagHash; QCryptographicHash hash(QCryptographicHash::Sha1); hash.addData(ba); integrityProtection += hash.result(); } //prepend a random char to the string char randomChar = char(qrand() & 0xFF); ba = randomChar + integrityProtection + ba; int pos(0); char lastChar(0); int cnt = ba.count(); while (pos < cnt) { ba[pos] = ba.at(pos) ^ m_keyParts.at(pos % 8) ^ lastChar; lastChar = ba.at(pos); ++pos; } QByteArray resultArray; resultArray.append(char(0x03)); //version for future updates to algorithm resultArray.append(char(flags)); //encryption flags resultArray.append(ba); m_lastError = ErrorNoError; return resultArray; } QString SimpleCrypt::encryptToString(const QString& plaintext) { QByteArray plaintextArray = plaintext.toUtf8(); QByteArray cypher = encryptToByteArray(plaintextArray); QString cypherString = QString::fromAscii(cypher.toBase64()); return cypherString; } QString SimpleCrypt::encryptToString(QByteArray plaintext) { QByteArray cypher = encryptToByteArray(plaintext); QString cypherString = QString::fromAscii(cypher.toBase64()); return cypherString; } QString SimpleCrypt::decryptToString(const QString &cyphertext) { QByteArray cyphertextArray = QByteArray::fromBase64(cyphertext.toAscii()); QByteArray plaintextArray = decryptToByteArray(cyphertextArray); QString plaintext = QString::fromUtf8(plaintextArray, plaintextArray.size()); return plaintext; } QString SimpleCrypt::decryptToString(QByteArray cypher) { QByteArray ba = decryptToByteArray(cypher); QString plaintext = QString::fromUtf8(ba, ba.size()); return plaintext; } QByteArray SimpleCrypt::decryptToByteArray(const QString& cyphertext) { QByteArray cyphertextArray = QByteArray::fromBase64(cyphertext.toAscii()); QByteArray ba = decryptToByteArray(cyphertextArray); return ba; } QByteArray SimpleCrypt::decryptToByteArray(QByteArray cypher) { if (m_keyParts.isEmpty()) { qWarning() << "No key set."; m_lastError = ErrorNoKeySet; return QByteArray(); } QByteArray ba = cypher; char version = ba.at(0); if (version !=3) { //we only work with version 3 m_lastError = ErrorUnknownVersion; qWarning() << "Invalid version or not a cyphertext."; return QByteArray(); } CryptoFlags flags = CryptoFlags(ba.at(1)); ba = ba.mid(2); int pos(0); int cnt(ba.count()); char lastChar = 0; while (pos < cnt) { char currentChar = ba[pos]; ba[pos] = ba.at(pos) ^ lastChar ^ m_keyParts.at(pos % 8); lastChar = currentChar; ++pos; } ba = ba.mid(1); //chop off the random number at the start bool integrityOk(true); if (flags.testFlag(CryptoFlagChecksum)) { if (ba.length() < 2) { m_lastError = ErrorIntegrityFailed; return QByteArray(); } quint16 storedChecksum; { QDataStream s(&ba, QIODevice::ReadOnly); s >> storedChecksum; } ba = ba.mid(2); quint16 checksum = qChecksum(ba.constData(), ba.length()); integrityOk = (checksum == storedChecksum); } else if (flags.testFlag(CryptoFlagHash)) { if (ba.length() < 20) { m_lastError = ErrorIntegrityFailed; return QByteArray(); } QByteArray storedHash = ba.left(20); ba = ba.mid(20); QCryptographicHash hash(QCryptographicHash::Sha1); hash.addData(ba); integrityOk = (hash.result() == storedHash); } if (!integrityOk) { m_lastError = ErrorIntegrityFailed; return QByteArray(); } if (flags.testFlag(CryptoFlagCompression)) ba = qUncompress(ba); m_lastError = ErrorNoError; return ba; } UDJ-Desktop-Client-0.6.4/README.md0000664000175000017500000001151412051252546015677 0ustar kurtiskurtis#UDJ UDJ is a social music player. It allows many people to control a single music player democratically. Checkout the [UDJ homepage][home] for more information. This is the official UDJ Desktop Player. For more details on actually interacting with UDJ (so you can do something like creating your own client), see the [UDJ Server Repository][server]. ## Building The Desktop Client ### Requirements The UDJ Desktop Client requires a couple external libraries and an external build tool called CMake. That said, UDJ is cross-platform and can be built on Windows, Mac OSX, and most distributions of Linux. 1. CMake is the build system used by Desktop Client. Precompiled binaries for both OSX and Windows can be found on the [CMake Website][cmake]. Most linux distributions have CMake in their package repositories. It can also be built from source which is also located on the CMake website. 2. Qt is the cross-platform GUI framework used by the UDJ Desktop Client. The SDK and libraries for all platforms can be downloaded from [Qt's website][qt]. Most linux distributions also have Qt in their package repository. Note that the Qt phonon library is also required. 3. Taglib is used by the UDJ Desktop Client for identifying song information. The source can be downloaded from the [taglib website][taglib]. On OSX, taglib can easily be installed via [homebrew][brew]. On Linux, most distributions have the taglib library in their repository. On Windows, shit is tough. I'll try to add some instructions on that later. 4. (Windows Only) OpenSSL is not bundled with Windows for severally reasons (all of which piss off the lead developer). A binary distribution for windows can be found [here][win-openssl]. ### Configuring If you've installed all of your libraries and cmake in default locations, configuring should be very straight forward. Simply use cmake to configure the project (we recommend an out of source build). You can turn on debug messages by setting the `UDJ_DEBUG_BUILD` variable to `ON`. #### Note for CMake 2.8.8 There is a regression in CMake 2.8.8 that gives the DeployQt4.cmake some issues. Applying this [patch][deploypatch] to it should fix the issue. Alternatively you can simply change the line in DeployQt4.cmake that says function(resolve_qt4_paths paths_var) set(executable_path ${ARGV1}) to function(resolve_qt4_paths paths_var) if(ARGC GREATER 1) set(executable_path ${ARGV1}) endif() #### Note for building on Windows with CMake 2.8.8 and below There is a deficiency in the FindQt4.cmake module for CMake 2.8.8 and below that does not allow it to find the phonon_ds9 backend on windows. This can be fixed by applying [this patch][findphononpatch] to the FindQt4.cmake file. Alternatively, you can simply change your FindQt4.cmake file yourself like so. Find the line that says: SET( QT_PHONON_BACKEND_PLUGINS phonon_qt7 ) and change it to: IF(APPLE) SET( QT_PHONON_BACKEND_PLUGINS phonon_qt7 ) ELSEIF(WIN32) SET( QT_PHONON_BACKEND_PLUGINS phonon_ds9 ) ENDIF() ### Building on Ubuntu 12.04 LTS 1. Enter the command "sudo apt-get update" into Terminal to update the repository on your machine. 2. Enter the command "sudo apt-get install" with the following dependencies to build UDJ: - cmake - libqt4-dev - libtag1-dev - liphonon-dev - phonon-backend-vlc - build essentials 3. In the /build folder, enter "make" into the Terminal to create a MakeFile 4. Change into the /src folder and enter "./udj" to run the UDJ Desktop Application ### Building CMake will generate different projects base on your host system. On OSX and Linux the default is a makefile based project. Hence a simple issue of the `make` command will build the project (unless you've configured CMake to generate some other type of project). On Windows, CMake generates a Visual Studio solution file that can then be used to build UDJ. ## Who Are You? UDJ is a team effort lead by [Kurtis Nusbaum][kln]. I really like computers and programming. ## License UDJ is licensed under the [GPLv2][gpl]. ## Questions/Comments? If you have any questions or comments, feel free to post them to the [UDJ mailing list][mailing]. [home]:https://www.udjplayer.com [server]:https://github.com/klnusbaum/UDJ-Server [kln]:https://github.com/klnusbaum/ [gpl]:https://github.com/klnusbaum/UDJ-Desktop-Client/blob/master/LICENSE [cmake]:http://www.cmake.org/cmake/resources/software.html [qt]:http://qt.nokia.com/downloads [taglib]:http://developer.kde.org/~wheeler/taglib.html [brew]:http://mxcl.github.com/homebrew/ [mailing]:mailto:udjdev@bazaarsolutions.com [deploypatch]:https://github.com/downloads/klnusbaum/UDJ-Desktop-Client/0001-DeployQt4-Set-executable_path-if-actually-passed.patch [findphononpatch]:https://github.com/downloads/klnusbaum/UDJ-Desktop-Client/0001-phonon-backend-tweak.patch [win-openssl]:http://www.openssl.org/related/binaries.html UDJ-Desktop-Client-0.6.4/CMakeLists.txt0000664000175000017500000000457012051252546017164 0ustar kurtiskurtis# # Copyright 2011 Kurtis L. Nusbaum # # This file is part of UDJ. # # UDJ is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # UDJ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with UDJ. If not, see . cmake_minimum_required(VERSION 2.8.7) PROJECT(UDJ) include(VERSION.cmake) SET(PROJECT_VERSION_MAJOR ${VERSION_MAJOR}) SET(PROJECT_VERSION_MINOR ${VERSION_MINOR}) SET(PROJECT_VERSION_PATCH ${VERSION_PATCH}) SET(PROJECT_COPYRIGHT_YEAR 2011) SET(PROJECT_VERNDOR "Bazaar Solutions") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_COPYRIGHT_YEAR "2011") set(PROJECT_DOMAIN_FIRST "klnusbaum") set(PROJECT_DOMAIN_SECOND "org") set(PROJECT_DOMAIN "${PROJECT_DOMAIN_FIRST}.${PROJECT_DOMAIN_SECOND}") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") FIND_PACKAGE(Qt4 4.7.1 COMPONENTS QtMain QtCore QtGui QtSql QtNetwork QtXml REQUIRED) FIND_PACKAGE(Phonon REQUIRED) include_directories("${PHONON_INCLUDE_DIR}") IF(WIN32) FIND_LIBRARY(QTSPARKLE_LIBRARIES qtsparkle) ENDIF(WIN32) include(UseQt4) include(UDJCPack.cmake) SET(CMAKE_AUTOMOC TRUE) FIND_LIBRARY(TAGLIB "tag" PATH) IF(NOT TAGLIB) MESSAGE(fatal_error "Could not find taglib") ENDIF(NOT TAGLIB) FIND_PATH(TAGLIB_HEADER_PATH "taglib/taglib.h" PATH) IF(NOT TAGLIB_HEADER_PATH) message(FATAL_ERROR "Couldn't find path to taglib header") ENDIF(NOT TAGLIB_HEADER_PATH) include_directories("${TAGLIB_HEADER_PATH}/taglib") set(UDJ_DEBUG_BUILD FALSE CACHE BOOL "Enables/Disables a debug build of UDJ") IF(UDJ_DEBUG_BUILD) ADD_DEFINITIONS(-DUDJ_DEBUG_BUILD) ENDIF(UDJ_DEBUG_BUILD) set(HAS_CUSTOM_CA_CERT 0) IF(CUSTOM_CA_CERT) CONFIGURE_FILE(${CUSTOM_CA_CERT} ${PROJECT_BINARY_DIR}/serverca.pem COPYONLY) set(HAS_CUSTOM_CA_CERT 1) ENDIF(CUSTOM_CA_CERT) set(IS_APPLE_BUILD 0) set(IS_WINDOWS_BUILD 0) IF(APPLE) set(IS_APPLE_BUILD 1) ELSEIF(WIN32) set(IS_WINDOWS_BUILD 1) ENDIF() ADD_SUBDIRECTORY(src) UDJ-Desktop-Client-0.6.4/.gitignore0000664000175000017500000000002012051252546016376 0ustar kurtiskurtisbuild .DS_Store UDJ-Desktop-Client-0.6.4/doc/0000775000175000017500000000000012051252546015163 5ustar kurtiskurtisUDJ-Desktop-Client-0.6.4/doc/UDJ.10000664000175000017500000000164612051252546015676 0ustar kurtiskurtis.TH UDJ 1 "June 8, 2012" "version 0.5" "UDJ" .SH NAME UDJ \- A social music player .SH SYNPOSIS .B udj .SH DESCRIPTION UDJ is a social music player. It allows you and your friends to collaboratively select which music is playing, in real time. Whether you're at a party, in a bar or restaurant, or just hanging out, UDJ is the perfect way for everyone to participate in the music selection. .PP First start the UDJ music player and import your music library. Once you do that, music can be added to your current playlist from any UDJ client you want (including this one). Your friends can also contribute to the music selection process as well from any of their client programs. UDJ will always play the currently most popular song. .SH AUTHORS: Kurtis Nusbaum - klnusbaum@bazaarsolutions.com .SH BUGS: Bugs can be reported on the UDJ Desktop Client github issue tracker https://github.com/klnusbaum/UDJ-Desktop-Client/issues UDJ-Desktop-Client-0.6.4/CPackOptions.cmake.in0000664000175000017500000001257212051252546020371 0ustar kurtiskurtis# This file is configured at cmake time, and loaded at cpack time. # To pass variables to cpack from cmake, they must be configured # in this file. if(CPACK_GENERATOR MATCHES "NSIS") if( NOT EXISTS "@CMAKE_SOURCE_DIR@/admin/win/vlc/") MESSAGE(FATAL_ERROR "\n You don't have vlc in your admin/win/ dir. \n Please change into that dir and execute 'sh update-vlc.sh'" ) endif() #SET(CPACK_NSIS_INSTALL_ROOT "@CPACK_NSIS_INSTALL_ROOT@") # set the install/unistall icon used for the installer itself # There is a bug in NSI that does not handle full unix paths properly. #SET(CPACK_NSIS_MUI_ICON "@CMake_SOURCE_DIR@/Utilities/Release\\CMakeLogo.ico") #SET(CPACK_NSIS_MUI_UNIICON "@CMake_SOURCE_DIR@/Utilities/Release\\CMakeLogo.ico") # set the package header icon for MUI #SET(CPACK_PACKAGE_ICON "@CMake_SOURCE_DIR@/Utilities/Release\\CMakeInstall.bmp") # tell cpack to create links to the doc files #SET(CPACK_NSIS_MENU_LINKS # "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cmake-gui.html" "cmake-gui Help" # "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cmake.html" "CMake Help" # "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cmake-properties.html" # "CMake Properties and Variables Help" # "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/ctest.html" "CTest Help" # "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cmake-modules.html" "CMake Modules Help" # "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cmake-commands.html" "CMake Commands Help" # "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cpack.html" "CPack Help" # "http://www.cmake.org" "CMake Web Site" # ) # Use the icon from cmake-gui for add-remove programs #SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\cmake-gui.exe") # #SET(CPACK_NSIS_PACKAGE_NAME "@CPACK_NSIS_PACKAGE_NAME@") #SET(CPACK_NSIS_DISPLAY_NAME "@CPACK_NSIS_PACKAGE_NAME@, a cross-platform, open-source build system") #SET(CPACK_NSIS_HELP_LINK "http://www.cmake.org") #SET(CPACK_NSIS_URL_INFO_ABOUT "http://www.kitware.com") #SET(CPACK_NSIS_CONTACT @CPACK_PACKAGE_CONTACT@) #SET(CPACK_NSIS_MODIFY_PATH ON) ##### all options #CPACK_NSIS_MUI_ICON The icon file (.ico) for the generated install program. Both this and CPACK_NSIS_MUI_UNIICON need to set for this to have any effect. installer.ico #CPACK_NSIS_MUI_UNIICON The icon file (.ico) for the generated uninstall program. Both this and CPACK_NSIS_MUI_ICON need to set for this to have any effect. uninstaller.ico SET( CPACK_PACKAGE_ICON @CMAKE_SOURCE_DIR@/admin/win/nsi/installer.ico ) # A branding image that will be displayed on the top bar inside the installer. installer.bmp #CPACK_NSIS_EXTRA_INSTALL_COMMANDS Extra NSIS commands that will be added to the install Section. ExecWait '\\\"$INSTDIR\\\\vcredist_x86.exe\\\" /q:a' #CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS Extra NSIS commands that will be added to the uninstall Section. SET( CPACK_NSIS_COMPRESSOR "/SOLID lzma" ) # The arguments that will be passed to the NSIS SetCompressor command. /SOLID lzma #CPACK_NSIS_MODIFY_PATH If this is set to "ON", then an extra page will appear in the installer that will allow the user to choose whether the program directory should be added to the system PATH variable. ON #CPACK_NSIS_DISPLAY_NAME Undocumented. "${CPACK_PACKAGE_INSTALL_DIRECTORY} My Famous Project" #CPACK_NSIS_INSTALLED_ICON_NAME Set the icon used for the Windows "Add or Remove Programs" tool. "bin\\\\MyExecutable.exe" #CPACK_NSIS_HELP_LINK Adds link to registry. URI. "http:\\\\\\\\www.my-project-home-page.org" #CPACK_NSIS_URL_INFO_ABOUT Adds link to registry and the vendor in add/remove programs' "Click here for support information" in program entry links here. "http:\\\\\\\\www.my-personal-home-page.com" #CPACK_NSIS_CONTACT Adds link to add/remove programs' "Click here for support information" in program entry. "me@my-personal-home-page.com" #CPACK_NSIS_CREATE_ICONS_EXTRA Additional NSIS commands for creating start menu shortcuts. set(CPACK_NSIS_CREATE_ICONS "CreateShortCut '\$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${PROJECT_NAME}.lnk' '\$INSTDIR\\\\${PROJECT_NAME}.exe'") #CPACK_NSIS_DELETE_ICONS_EXTRA Undocumented. Possibly: Additional NSIS commands to uninstall start menu shortcuts. #CPACK_NSIS_MENU_LINKS Used to override the Start Menu links. "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/CMakeSetup.html" "CMakeSetup Help" #CPACK_NSIS_MUI_FINISHPAGE_RUN If used, will make it possible for user to choose (on an additional page, displayed at the end of the installation) to run intalled program. Should point to program name to run, seemingly without any sub-directories of the installation directory in case program installed in such sub-directories (but please check generated NSIS script if you can't make it work). "MyExecutable.exe" endif(CPACK_GENERATOR MATCHES "NSIS") ## include the cpack options for qt dialog if they exisit ## they might not if qt was not enabled for the build #INCLUDE("@QT_DIALOG_CPACK_OPTIONS_FILE@" OPTIONAL) #if("${CPACK_GENERATOR}" STREQUAL "PackageMaker") # if(CMAKE_PACKAGE_QTGUI) # set(CPACK_PACKAGE_DEFAULT_LOCATION "/Applications") # else(CMAKE_PACKAGE_QTGUI) # set(CPACK_PACKAGE_DEFAULT_LOCATION "/usr") # endif(CMAKE_PACKAGE_QTGUI) #endif("${CPACK_GENERATOR}" STREQUAL "PackageMaker") SET( CMAKE_SOURCE_DIR @CMAKE_SOURCE_DIR@ ) SET( CMAKE_BINARY_DIR @CMAKE_BINARY_DIR@ )UDJ-Desktop-Client-0.6.4/admin_win_Toolchain-mingw32-openSUSE.cmake0000664000175000017500000000214412051252546024311 0ustar kurtiskurtisSET(MINGW_PREFIX "i686-w64-mingw32") # this one is important SET(CMAKE_SYSTEM_NAME Windows) # specify the cross compiler SET(CMAKE_C_COMPILER ${MINGW_PREFIX}-gcc) SET(CMAKE_CXX_COMPILER ${MINGW_PREFIX}-g++) SET(CMAKE_RC_COMPILER ${MINGW_PREFIX}-windres) # where is the target environment containing libraries SET(CMAKE_FIND_ROOT_PATH /usr/${MINGW_PREFIX}/sys-root/mingw) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) ## configure qt variables # generic SET(QMAKESPEC win32-g++-cross) # dirs SET(QT_LIBRARY_DIR /usr/${MINGW_PREFIX}/bin) SET(QT_PLUGINS_DIR ${CMAKE_FIND_ROOT_PATH}/lib/qt4/plugins) SET(QT_MKSPECS_DIR ${CMAKE_FIND_ROOT_PATH}/share/qt4/mkspecs) SET(QT_QT_INCLUDE_DIR ${CMAKE_FIND_ROOT_PATH}/include) # qt tools SET(QT_QMAKE_EXECUTABLE ${MINGW_PREFIX}-qmake ) SET(QT_MOC_EXECUTABLE ${MINGW_PREFIX}-moc) SET(QT_RCC_EXECUTABLE ${MINGW_PREFIX}-rcc) SET(QT_UIC_EXECUTABLE ${MINGW_PREFIX}-uic) SET(QT_LRELEASE_EXECUTABLE ${MINGW_PREFIX}-lrelease)