#!/bin/sh # MetaCard 2.4 stack # The following is not ASCII text, # so now would be a good time to q out of more exec mc $0 "$@" SManaging Music## Player stack ## By Eric Chatonet ## 7/13/05 ## http://www.sosmartsoftware.com/ ----------------------------- ## This handler traps when the user presses the space bar: on keyDown pKey if charToNum(pKey) = 32 and the enabled of grp "PlayGroup" then -- ASCII code for space send "mouseUp" to btn "PlayPause" else pass keyDown end keyDown ----------------------------- ## This handler traps when the user presses the return key: on returnKey set the currentTime of player (the uPlayer of grp "PlayGroup") to 0 set the thumbPos of sb "MusicProgress" to 0 end returnKey ----------------------------- ## This handler sets a short cut for looping on commandKeyDown pKey if charToNum(pKey) = 108 then -- ASCII code for l set the hilite of btn "Loop" to not the hilite of btn "Loop" else pass commandKeyDown end commandKeyDown ----------------------------- ## This handler sets the player loudness with arrow keys on arrowkey pKey local tCurPlayLoudness ----- put the playLoudness of player (the uPlayer of grp "PlayGroup") into tCurPlayLoudness switch pKey case "left" if tCurPlayLoudness = 0 then exit arrowkey subtract 10 from tCurPlayLoudness break case "right" if tCurPlayLoudness = 100 then exit arrowkey add 10 to tCurPlayLoudness break case "up" if tCurPlayLoudness = 100 then exit arrowkey put 100 into tCurPlayLoudness break case "down" if tCurPlayLoudness = 0 then exit arrowkey put 0 into tCurPlayLoudness end switch ----- put MyRound(tCurPlayLoudness) into tCurPlayLoudness -- -- see MyRound function below set the playLoudness of player (the uPlayer of grp "PlayGroup") to tCurPlayLoudness set the thumbPos of sb "Loudness" to tCurPlayLoudness end arrowkey ----------------------------- ## this handler checks if QT is intalled and if the version is sufficient to play mp3 files according to the current platform: on CheckForQT local tStatus put QuickTimeLongVersion() into tStatus -- -- see this function below switch case not line 1 of tStatus -- i.e. false put "QuickTime is not installed." into tPrompt break default switch case line 3 of tStatus = empty put "QuickTime" && line 2 of tStatus && "is installed." & cr & cr & "This version allows to play mp3 files." into tPrompt break default put "QuickTime is installed." & cr & cr & "Your QT version:" && line 2 of tStatus & cr \ & "In order to play mp3 files, you should upgrade at least to" && line 3 of tStatus & "." into tPrompt end switch end switch answer info tPrompt as sheet end CheckForQT ------------------------------ function QuickTimeLongVersion local tLongQTVersion,tShortQTVersion,tShortRequiredVersion,tLongRequiredVersion ----- set the itemDel to "." put QTVersion() into tLongQTVersion put item 1 to 2 of tLongQTVersion into tShortQTVersion ----- -- fixing the minimum required version according to platforms to play mp3: switch the platform case "MacOS" if word 1 of the systemVersion >= 10 then put 6.4 into tShortRequiredVersion put "6.4.0" into tLongRequiredVersion else put 6.0 into tShortRequiredVersion put "6.0.3" into tLongRequiredVersion end if break case "Win32" put 6.4 into tShortRequiredVersion put "6.4.0" into tLongRequiredVersion break default answer info "QuickTime is not available on Linux." titled "Error" exit QuickTimeLongVersion end switch ----- -- testing results: switch case tShortQTVersion = "0.0" return false break case tShortQTVersion < tShortRequiredVersion return true & cr & tLongQTVersion & cr & tLongRequiredVersion break default return true & cr & tLongQTVersion end switch end QuickTimeLongVersion ----------------------------- ## creating a temp folder and creating a mp3 file in it from data stored in a custom property: on CreateSoundFileFromCustomProp pMusicData local tTempFolderPath,tFileType ----- -- creating a temp folder in Rev main folder: put TempMusicFolderPath() into tTempFolderPath -- -- see this function below if there is no folder tTempFolderPath then create folder tTempFolderPath ----- -- if the file is not created yet, we create it: put tTempFolderPath & slash & "Music Test.mp3" into lMusicFilePath if there is no file lMusicFilePath then if the platform = "MacOS" then put the fileType into tFileType set the fileType to "TVODMp3 " end if put pMusicData into url("binfile:" & lMusicFilePath) -- note that using a binfile is here compulsory if the platform = "MacOS" then set the fileType to tFileType end if end CreateSoundFileFromCustomProp ----------------------------- function TempMusicFolderPath local tTempFolderPath ----- put the stacks into tTempFolderPath filter tTempFolderPath with "*revmenubar.rev" if tTempFolderPath = empty then answer error "Could not find the right path to initialise some stuff." with "Sorry" exit to top else set the itemDel to slash put "temp_Music Folder" into item -3 to -1 of tTempFolderPath return tTempFolderPath end if end TempMusicFolderPath ----------------------------------- -- this function is used due to a bug: you have to set the pageInc to 9 to get the ticks displayed correctly with OS X on the loudness scrollbar -- and we want the playLoudness to be a multiple of 10. So we make a correction: -- note there are no ticks visible with Windows function MyRound pNumber switch case char -1 of pNumber = 0 return pNumber case char -1 of pNumber < 5 put 0 into char -1 of pNumber break default add 1 to char 1 of pNumber put 0 into char -1 of pNumber end switch return pNumber end MyRound X@uCancelMessagefalse uMusicTest\ID3RTENC Amadeus IIPRIV3@Amadeus II 3.5pdatAHCGDGCHAAAAAAGAAAPPPDAIAAAAd DiHIjP!!|#  t߫@  a4h @~a0j`4hѣ@P( 0-8D>}tKU6Ls M1D )-D4"`1x 5V jI 8 4Grh1' Zbc:d ,vU ) (T-n5Z|C0$p``|:)1He|bk{ cO,"Z$`F%y-A^KD D,I \hXHrî:kR*z]$@@{>v6O>C!=5C,j }UꯦΈ7R.*!jNxJg9[PhIbR=:^/m/j% hO7xohq`SDt*J(11L4D >s'yBX P<uj^jysnȓHVݰʱyʓwʘ}61Vg>XGyÙ4 $h O$lr:4/B͖g+iA~2r"=06%0Ԗ6|{¿~ϳ]S"I[ ):b!$0D :mJNXtQF~!(ήvӀ $e+>L4qXtKPh~F4Nđ`Jج236EriEWɻUP#2 <<:k1FM<6Md 2o<t8ɜ3 ZmqoNѴ[:tp` }/38B ֕/H~*м]UvZ̔֐50XPt/GɿSN6%PVaxyu7$Q7/0$y30xU-xÛȆ`d 2qJNpxP2 /nO`$SRjIEFjRWjZ`,O"bOk9Zz:KK6Ӟ\0sC$\XNbAs8#4=nD~g3&V]7A7 ;0y=~ϩB4A4i#5cd ص6iJnp : $=AWy+|1A~LY#ۺ"[m!RS^.![ht6FT-N\)sJߞ/*vf(סO@I13Є,mIPNܡm$&d. @4sGNp J >GDAbe膢z:Qx9'NtkAu @hYiA5@+5<gؼ*+ǀlFkG@en_49 <"F\ecL % ]]]:4l 6hZwK@ROŜ(dD h6i:np_3j^i`YmLSI}#Xj +]v+OGj;o{Q_0$0Q3-HA"+0u66/ګb~+V|H@jq=|/$zdCqzz=5\b=Y]dY 2m1ntD;ݕS9w@Vx=$M@^h+ɮ znG`5h٭0'6`,Ai``) >}Śz}ËX' ae)mmPoH͑۬]=n 6Ng~CM(NPLDIa2A O{Mdo 2mJjpʖmmjXUc~H1gܖ^~eDEu7гӐi?9+9lSmujUKUs4+v V>aԴW!Lt (ne‚fY/Ju5,ܴoRfd ,2i%y6hԀi,/: Y!& 2rX T 7$3 ZQA}c[)OӆFeO[#|PYm~ϹP]TD3i(@Auִ#U{0QHva|8mBh:lҞ8_6U5d 6 mJ1rhĔ/5R1!t`0h.M$P/2ր'IW <xcu?X׀J1l}WX: c! @_sFnMJd Ե.mJjdx4*+ՋŲA6i`b'A`/U|ԾFwr1)6jL!AEZh_S wϚ؉G5s~b}K}۠t=froBO0 C@/;A!2@xqB}Yp'ot#M[d ,s)jdĔ1+t,ںߙy#W/CUg..?ս~N6;uZ`a &] PP#܊}5h'Nۼ@ZP_CO;GUCi$a1….ĤHC)l(ֶ @HzL2t]Qd ,mJnXʔK2Pn6]|4/ur`nݽz{ }'B"pyvpڛ l✷W1&'6B)G$sNȱEs]*/z"#kT5 ]:Q!]*jWKu$Rv;:B]md L*qKnP%%`@,*4_(utgzFb.;a7T#qԿ4spi1±sE(mPU1OE!ÿGX[$D~ ; I_<ϤihvY )O 'B O|_hE;5*(v4ꃘ58CC5%b%- ic5*pԜpd `*s.nLА- -ћF]l#0R `fa̟\w(Y! OYYߊ|-x%k{/4Ӹ[:Or-^ 1YUW+ 0| A ss@Gs\cZf-kN_2 #+]=fvfd ԧ(mA"X̫ڌs:n^eApҠտly~yrR! 0T6;AHRu%>^ZΔMSKnΕq p2@?) #DB)x<Xtww a%7'I S(t4F d x(s+jXXT%eAUG\ 6RNB KD$Ռ6fM}`/e rDbQA>d+.SvM.4[aV{ҁ/rh@bbVK骪,X1Q.~vUZԍr $@y"D4k)AnTK(F931S:d-!ُcĽVf^O9U_SͺEsX`L LG@d1gQv-, :hn"DBX c`LE|:͓`gJ,VQi1_2TlBHҝ\%JD Կ8iJn\ E`PO$(3G7˽"'xjAܔGC_AOguV$ vhpqd:PUJ֖Xq=JPeyN/'yi5/)A3t JGO*GUQB0 ˏ>I D p8i<P\"e1FrAUrfC1ؒ,J,#oDη,IcSKI,oʐ/O}/mAVhn2, '/iE_3`vw#Kogz'(5WVe6Vm \QAl9Egיkk{RY/ 95>pXى 'V&lֵ{ z0e;naN`XAn)O}JCf&mnMxD 4i:AN\(:'sNj Qŵgu͹VB)Ɇ :0?ѣ2倨jX8'8:r6)b$Th-m~7k:[F5F!.4{=^rDܹ0HWA<%gIUHSGd 2i<!Rdʔgիќ OIkӶe$aBuXF8eKـDlXPa)x~ެżɛ1sN9lZ~WmQͷcrR8^,)K׾ŃMdx(b͙@.LzFNZP5Mj2D l2itIf\tgW@e T^H?eV6 x0y3 y aPeUy VG6C's,> 2=>;JU , Ϧ81S}_j,1q`FDa;H`T, w%vYMn;Sze؎Q@>jd 0i<"`DqKǭSR9BbW}J8%c (})7ɘՃH؝A+Ya3ʟ8tW^} nFb  !4 ?uog$W31:5i hȌPM`9d .m:nTFvπC(5U蕬 O%`xijk FnQeY- 3vX ̖\fh;`(bT vPgEjjB 5,(nXtЇZtËr˶'©H: $sd ̧*i&YTĖQ&a!-~?ģcU DYp RՊ+)&Hxo7"J4%Cpl&2pM#(}^D5h=ܶ.yTrM\9nZ.Ht*&I6DSLxK] %^ }C%;0%~LZ (7]L~ d *i<rP̔{:2̫OXbQ7RİRPPVUb528=M:Z( +X1XhkU@_pCmYAб=cFqф$c#\|u?]˒4K; ѠJhá@74 ">7,$*2A\(Ou6Kd l,i%FPT  Ua,)M*V o8qc$Xs3<6M;)ӐevXX2eXg&,\6D|ՄT:]  u8lTw7yCH\>9B)[Ye8񼞎J3(NHtlCPZZD `(e#fPBȋN 㚱ly3׼!%](0!5K7*4Y~C_@sL,#W{[pknC@ b4#`BԋlEO%LsFDH%#Y&!IPH[E:vWv~:Haƃd (oLks*^W7'09Q(<`sPyuzZL{#NΊGӳ5!ZY A ΙI_fzvDuwЙ\ Y0!YE3R&l$*D4Ѯ釐Et2…GTFfkYW^d &g aHE,Y^9Ϲg\xN~+KMjL`jGBIYY8%f[ G_  k@QDQWʒ .]6!gƟߕuX f怉:k (֦AsZD|FM4h5DmD5:-!D У$ iHHx3v&? nQI9}VSlh86Z^}4*"1S,#| !Iח0_x `aA T),\Ӑ \=J %"0a  `CHKV֗;U *Jx+IYh,)l Lˡd "i%Q"P~ q2I oCtm Y%}J$s>0`fmUlKf>zEDț Qڭr>#tЦA -:>֐rtm.u ^ ot!ƥB8t 6OcRVq9ݶ5>G[dm% NP>l/?Yus5xuRĩA P "` 9LMFgn9hwc7utPiv{q@".'E@ 'qƆX>R @4h"YsjV ,Y|Z-.W'L]bWPd "iJhL҈JDYq<Λ;l]y`)L}#OpPg X%؁#)CF7eyoȷQi b !7pdDE-޿Y7thթS1?Z iQ(ij$VW*I!Ԇ`0Ia*vD mJrD ʗܣ9ikv1$)amp$ޏN,9Ÿ f(h<@k~eI/T7 "F%|qd"宎%jkG\=i \ou*9]]2Da`Jq'*6d%ԾA*ൎ.d2D1D ̅"JHYXzA:~rY D O ){5=biR}OHorhaos?åˀM"kKl^$0h!KX2'`=pTf.3fS*=a\.sch' Ż4D+: <(^\_xfKվsm<1'ӿlH1 ,K,X vur f$foneA<Ϩ wTK^gwlkm{N\gdj`y'{4c@iR<R0دSTl_ MJqu(MIR ڋ,f!r=uj6I0=?FDU >4yPXIS;&ڟ+Wo|A<8|0BkqrJGb4Az$ EIp xuCZڪ]æ5N4;]n*\AŨ|٦ !̲sZ_713~4ިuG \"y󀒢DA P6s-jLK$˹To:dk!-DuL3<dyG% 2 P ptxoZ'GWy^=Í˼k y'WvjFu Uts>9+F(e>M!ႊ~T,w1E.]cQ ~ss),D1 6sEXʒqAP ]ALHYC| |hĊ=o4<[W̦f $ [Jy\Y;0|8#dG)FKAjQT@v~q_o(}tIUpֆPg&B+yФ)yg^rkkD 6sd #ڱ&3]YJ\tss3B5Q򮺋"'EIk&v'fDaNVYql`?,j~Q;)Y-3x O5jߋjfI5F>F:3pb `@xjtd 6m:ptLKs[8j)n9 T43ic>bUc)LMO^'>ϯ/VY;, ,j#A R]@4chӹ 珻jq*I~@$8 i33PG91,b\:#݉?O JCcP,Z$8LLdx",텩uBǾ~o?>WЮ6yNk3CdW \4iHjl8D9QMb9}э4v1蠟wdp 0k jp<?Lcnz7r=?  24uXGјCXBtrlCM9cQDh^n:r B uDm@1X 7GE$6 i۾`t4 FlNCz̀Ws9u;ܰšLrN|Ҟ:v%ب277D 82iHazhΐѶ#3RSU+M!YVH@*RX]a7^ 3̜Zz}զ/rCgt!JG ƌHXBK,P- ĽBHV7ċFtqZÊzN}t i`^MUd H2a>Ndx0bڈUI0$/rڮNFaSml3B>SAnx)A+TSH*`;sD"-"G03+[`ƵLu]5gq2{?)^վdhf:%}U$e2 1 d .eLYnhD.=^S W9,OeJy-HwBFC VQ<琖]&CV{#@_Bw$aЮ@tg~JDWަa[@ =}VlZlxUE.T2׬Bas)rQ ЉJd ,gJ: Nl<˽Rn'zq3C,`6&d6E3hDU*(:ֱ3پ^,da F 5UW҆7SN%nUb NFa*pyn@ʜݲY C^[ 񭿟d $o+)L朩uQ*^v_ݖ6N 1]CScYĎ50VY̓GEM D0yDoN<}<_Z}j%Jtl7̘Q2 Gf3(R{SrʃZ$`&Y3͟fd Ы(eMPΒ`0'Z|@u|R\>ԓ C( m`"Y ʬѐOt#D(=8t:I^[_bۄ-"']7`IX[EG(hp3 c6* {b5E`Qϳxd `*i&nXС% huo+5 "vw*&"[y.#zd)&Iۚ"(W*czef (wf5VF52MP #D $4mvT L$-eŶݨVEN c:&^*+I=Gq{x۬ ' 1eҍ?ЄIhY^WAش,ޡ6 gB  WOf=yC,yUi"}}Mg/+r=j\jC97rPoL!oD `2oNP"Θ<Qzʳ\SBnDCo|>nY!{ !*s M!($[#1k0\,.;傚eRuV-ӧJd7,.kӚ#>45~=d !d9q3_B▤hubȄ#D 2mJT$u $.$|0ć48ʬE_3V4  uiP`2@a )..p3>םѧWo/zVHc~Ħmc8g_rD:`&| Ob8$/!f%Cɗ v~Xhcd 0m:i"`xNFA^>Ǯ|x!7R!]S̖lx4C hH}=Y"2!B3 FރNd dUL(gABFo#mPgA%? py`rQ@Gэx8;/*+*;| UD.6w2d 0l“!`u/9oc&@rK!I(ce!֚xnTYbE#}pY( g#p K&PlhچN2İc,!0IBMJӺzy\'JX3D P0mrR\8 0:Ga0 0dY:H"b3uEw`we̤3EJ߼H#%}rǃ 3JKC(nfr']Fh$ O`2 %" ũnG20d4ćh 95l&@d x*sjP<ᒙePjpl~%@` DS"(Dٗn0Yb%BLM[e>z!\g̭ +9 ֬Yqa&)_`#qyڤ =ѐ/۷*͠Uvc H{ nU{d *i-rP4Wm&{fxqꅢAX" pB8PUy$3Q3EI3>+?F2=GqZ;qLPbKFczwBuGG 6 ŻF0XH*%5 ?G &sq^CG̷9'Frd @(o)ivP q#A9΅x帔?KBwPSp@rcPkSﭧ][֒@PDt0*a|)o %S&ԤHTDnЭJv`*B6&8}" /O\éVfc)𞦣 ]@@0^]d &oQFLƔMԞ+㾵JPqzI{FKE넺"@Lzų:JE>@v]mqPhU*n#;^LS|, ḶZhQo8ojj Ĕ `M@:&eJ˙vz#OGkY-6ˍd iHQjDɅ,neg6톣*o=g8R_//0AIW%VkU=2B+~ppGm*0\WB;]_uQB8F~JPhάZEUh %Y՜BFQ}J&(_ܵEW;YOE\s޼-S/TܥG#ܯH5 QuiMFyCmĥŗaC+:H\ͩik'$d $"m.fDg5Y>!{c}.RXDwoq $fP$%~zFו1, `)& Gs#_ '*pƓzM))CXŎ}u@ $LjPС u$3/bQڑ쵐@D݇$LMcD  <!RD ZX4Ejsض"KVh@cЮ* A4d8͈(7lA "\Rj@ _7Lji 4@?K-M J/p$4NB*զy:-% uqE+v얽S.6j==D:. H&NT]xRUb .t%9ϖt[<qTo&&!,ׅS^/tjS&\# c~;CU HE)~3ؕAkhT\h=8CO ?4㛆q'p3_6|y3zYI-gEDYdN<I\xc>JCܺa7n? iƈqnedQp0Є-|԰J5-%1>"djוxnfi!kV{%[Zq4&=JyךXlG2T=z+fU-J 2D `J4jX hY(@G0 Ns<L?:E$S:&&UzI[88PSg({!$'eᒯ hkOsEW *ˮS 0mN).Md)R8J?[15R/m6WjQVDbOڸ\00P"D Do<QR\ʒġpj?3taޠ==[g*oo[d5{` %Y0n.W5"T^)MU7H@n +)7Z5!TI}2Ϳ18x6BSWD#|3DP8~g*DC! q524҆.k:]'tD L@sJhxXη{m߭0BnL]S4&bz"n^jQ+~Q0걐72A5Isjiu`kIhLzf Fp NcagkS^^=h1gsEDۍ54k`%#ؠh@ Fm{jEHļd' <iJjtKrZչ6i;nvnn^|.]f,Up*oohx+_Gw"RCᢲbQo'ϓ ٨\pPՍ%MeA qe <2JV&Y~ttLMUOHOòy&6d: T<o; N|p҇YB׷D_YGwVR eWÆ1.'*O^3Tā @;ӶZӅ% kۣ0v* aw/uxE++7XABǓTvy(dku桳%'LײdR 8hʐY|Ew,P@ NߪFmgu3i6~`.?O :D ^H5."O+ZyAj*؛vZ5cse".۞ Yع0 ?K!>N:AB9BA%Y 7(֊n#cnW:di $8lǓj|<ǟP{ wp{o1@ PA`KYveEd9{#DY<DW")ly,np ԐV@ w[ B(U~%9)qIӧ}@Я?_!Q*!2BcSŋM&vZ3~,Yq,'޶d 6i!N|Ty==?bT0ӯ+28P<8:IhHjkPXQ4q !Ց=Ü+\&cVyd 8k:jt ="a{EGhnnNR1FhѰL”*lxKltqߎ*ftBKқ0\tB{+@ tRr'=,P}R঻SbHJ9O[3F՝0ak_Lul>\+d 8mJxҐT N5}LV7Mg"ěyĥOyb+&cT}jlӫ.NyMh~_F",evL o)-qBރ[4bD e{S[/Hpy# /YgF fH_͑rim5\?3EWR_v:D-& d 6k+t^7n pϵRo47[oPyq * ꪭ|`~Qmn߀e }ZkU*n=\6)=/>6ͯN_}#t-yOR0%OF@5P9@4-)%r[TKRL`R /\XRVrmjQd 4oKntĔQ[IKʲJƴS*~ ϠQh)w/- Bj^[XH C>Hf5&2* KQ1#Y*#XI@859|t9@60dp3C7\y h$7.RB5`SPb^Pgz- |vKR;RHD$| @"4< 􁤹IYg d D.s/YXԔq, ҙƬ"1zZORtȖ: n2qZe+6B3@Ēm/{oDʆ!=wYqv\Jb ognBx{&!Z߈pZQSPT}SيW*s02 QC`bp#!csRD ,.e R\Ek"6U*(@ dxء '}uD6]N1.[؎R7ŜɊja V $P na"YWo=Vyȝ !xlnPεg{ bNnY `Hf _S rIPCJd .o jX+/U._~ʹ*l΂F@݊Oc5 dA06/FdcUG%ߎ0FΝ2v:9 eGf%PAIgH5rt"7/^GM w=[u*,n`N YAM LP4in]td *o*<n\Ĕ>-|8Ax &F1DtV[XsݏƳcNk tr]Nn8(b" M\U,WY_HUoDz)FhZ )!a[HkJWJ4m>/w](#3P8c)fUUhfgypZ3&BX+D 0mJ!n`?{{ Oq'%?OvaI^,>.ʝoveㆯQNJDb5d&1{#GAZɂ&CǢ$I֠"_*޶C7X!GJB -[Yd 0g:jdkO[17DBʑH)c}nbz(;[wgWp!1K0q'i2'US 2EI3hd'uĥkcy~%6֝Sj]+~ugz2'oJ~=4zoXd.'OD @2iJ1n`O!゛I5wocSi#3Zիy}E)5߳~Ч%Ng@ukL(@ip;aB]3uUrtrZ$+zoaT0i1T!AyN &U#aƕwB.ɬ<1Sd 2ihĔcF#z r*~j?" :f-)/*I ^lh78}КIU/yi!az鄱fRtm7MB٩a YsD6pAS?K2"i=%$rR<\VFNd |.o<9nhݻZV nj6[)oĆVRAF{tj )sEE 9#AњWJٍpXkCy̩eIkվ2pr BfX@uXDjJMHw<]w\DusMO>P{2,|XBnU Nm50~=t/>LU(q`(.ƒ frz{k jJ \@ x @lKAAUB$H`8&IEeEAel%;Z;2 ʢsTb d *i(!Jd _ ZT~VEa!m zeIE{  %9vեpBUfaNTpzԮ.QlCM.wOG_W\ CaozB[UNJAKpj*jA|fW8_Kp2DB{X4 d H( o+,x\\v37Ed ̩(o= `t -uBQ#>^2HPuN Svu =[H5d.8p56^<9e Cr lr }n/3ڂe[塘)666Kښ Bef i88*VFޏLKĥ fjp HXj}d ( if!vPƔCѕjR[xfPQU}ds$bԷ*YaGX\=-n rXnݦcmVG[Ʉ`$7) /'Xc#D-hDa!Y-9ʞTV'|ؼbmi:݂)\& D t"k&.~HДфQY ];΁[Xs,cDkqUf¹s,hUi9S%8CYBhwjM^evdd `&dg1jLƔ H/¶ďL~2Xx4wl VKt8F|8Ď2Ruc,9Q$ev?E,86vk-{e-w_Z֚E8 ,F|њ0:8/RUs2@ qp =7}d @i!H5K~ӶK7KB"$sˏn*ET~(ABQۃ*fU$F]I%!Na&4nE,fY²e~• X$ۄ 3B5"΋Ry?DZW9 LFiLb%H ;RIx1RP d T iJ1BLEĻ}Pft\ؐr<6 {~Wn"FIY@?FMFn? FV5+&k̅wvD%kpIX#{ {S  2)!=Ggs9@coIus,b׮]hn8đZK!l8@d xo :BDxPj#xŔCDOu1m?|: 2S%,1RWFeNH;t1-VdvA wjԄN|5̓7FVaM!wM]⼘˅[ J LnMۍwyX^P V:g㎃d 8 o(Lfe"1)U~PB L( A ͟A /!`<* r#&nDlN`YZ+IE`? v?Hޙo ‚ f;TC8x*lL!$ ȜvKzg十h,u )1d a"iL J@ {ݻ>kKS=UUo@\̭&Bb[D(&v#徉+׌lͥ" zC;ww#n6ـm䵠l@akD2+0S:釻z9&k,.Y|ghD"VH-[gD. 8ʹ(iL[^N[yvr쟉UfĠLԼ3 İoRDF^6Q8sfODoZ&Ϩڥ=6AU}f5yWDY @(Xx_nۄ3O4fTI%ŀS3C/= %o#nc""easT 3Oc\PsuhXg(0pȁ@(T4he7=s.B,F` eZ|ː*Ā䳝2kp3ψ8DK 8qJiLĖ~ c_ 9c_:uh:A fO!̄7n>6ORPy#B+F?;AeLVm£Pū0PXQv@$ x8\ƫ,8 fD AWN0 LBVD3 T6mJTH|9F&x؈.?H9hP\{[ln>ƌ!C=1D/K.B3Pn]k0P"=Wow8  _g~مX3jDT ܝO[" tג.\=Rs\= N `"+MSPnj]uD' 8oJY\Ĕ$GKCNqEc :wy 3[$tze)ÐZ){XH fhh`,i7u&g8tO+z(.Ubu;Ԕ%R!=0`crUp% ha_qhDf9#A,d%(`@w*Zq#1b1d& 6qJHtp.LNVmjaXkmiKvObBR~ *9+ *S(*lٵC AZF,HB F5Ĺr6Ͳīq_[* A @S0Rͽs0 E,k"3-lRG'xD;D: {:iV)lĔ|򭆤?CsxS%+94 [3* ; /_Jqʤ& ~1Oiw": $TH{9撆=_"QeVu__%4jڝBњͻ D] yҞL+dO 6mKpt8,UXgXrlp.ZiGޢUC5.ާGEJ&#sXO gmՄhhssƋon jzI'eQ~d$ fz]jFGueV흏W#:-XL0Y]Gydd 4iJhx Z}ř3"p4*5߻?5ZD(g"l T(#9s b|RG jvh"I 9T7N%u,%taESV(9m:*ϡ>`tI(`Gk uuL*U4T6T/-HnI'͵8 PoPa g+GVaHVqr2 1 _%inuqd a4o1"`xDmt ưeTfyﯝYPݳM]Bڋ 4M[Ybf p;q%_- =,n3vۘ]D"R5AE e&z_kyI:Z\?Aߢ%&KEKo;^/d x0o".q\Ĕue`5pϕG2S%v-hR/(P)\!=vɬf1c}r67%=ﶀqv?eAYIH!tWҸEjf4ȉ`H"0K@*B%34F PS je}Αn:d У0q< V\ʖ n&~!ΧMFIaLU2xy(6sM H8ae*k),o:(\Jߚ9s~y^ L͜ʳˌS9""/FYb g}*` yƷl!B C"%=%%9ިqnZ*AFd $m%P Q fE9vixܼg39(Ggh*g@SVm@hH0spIx[]@=vk\OHdգTS\#Jڏ%Nwd\h M8f /oye `(x(0H&PfJD@n3=*82$XCtd ,o.APJ\ʹ7PUYr<03 =NZW =@aiG02JfW$uD* u=TG%Xi`F\glgv-i/'z گЏF}~72U a@5hM5wS#EB&hYD\׺pGf]@I*d *o+YT xeB',_6A}GfGhCŗʼz@f(P<(D}p] EeX2V;pELJƴ- C~LupM{*y+a~6RI&J0U%47L=0*1L44ϬPd ((oK T ĔU6F4j"=gl{tY7n9qAp4i-Mu[WWCPFJ)q3qvXb O?:&(vPuWR$ eHa,MB/[w9\ɦrU&JTnȳD |$o<VP ސ<o[}>v ԣ,q@gD:Y$LJy, R~#{21Xkdl=w__S-`9+I=IϜkh L8$lZ6b!$2a+.T al5d $s< X\zgU#{W_L;8d݃-,#Xz+G&E7;FYSW(d?R6";&`Ă\I$%R$ӣzcXS9"?LQ0f31ա12I;Qla"=BD9s2mPxEQM$x5aRB(2 =X]ѽ|TfܩoTj\*J *[etoԝqDd-A [/\~fCA^16Ԁ(ќB$9̚I@<\0FL(8.CxXuy[%r=*D <i<XxՇڑ1~ehgh37@2 l*&B)w1OJǼ0Qʗ*݋d#LDW_CN؄:dy &2+q=HM39Th֌ sqqz?g~fSw6)D 8mJX zS8%;'ӟf c\&b5f$|9P{Ɇf-W]iWbD x4mIrX ĔjwsJA(MijHH0@o0j+8S#P#|u-.TeKl+TOE/,Ͳ mSoѡdzּn ߦXuFh @;VcĜ1}4GW6a͛*LnMb8'5Q[d D0o : px/HrUSSѬ<4 q a!PLPD \4i:i`x /T]')WITg3|~r@}HVkV̈wbwAuD@-FbhISô9ugMf<툺=d ث2m%q`x 58JgbHS"9(G]Mջ a0H.!yL2 {9nHfVE~Pp }B3㜤Ѕ_\ Mx8BsB3&NghaEWfsd t0m<v\Ɣof>)ne{/OFL^ߎ< CRcӮ90+əjDj HaXnL,e\ޡԚ%Z)O/k P͹0{̀p¯lI'LH&1j51 ɚl$ώOPG%j2pT|.bAz?sƍTj7 O7d T2i<Q\xs%󕺺,HXl! P126cTeD>obKOr'ؓGZ霼V3!|X*hؕħժB%88KirU bL XSDY=IdEu` JZC}LZ3>3qKs{DѼ\`D h(k ,Tx2 Tb :Kl{uwL0 0Q^L}vf7z]RƞDx*!*O!AD wȆ7z/3TW̎B ᠘ {η;񐚖 ڕQҸPG ;D *k.RTR< G[${ x?"1#bҴ)*YzCpȣK9gsyv  g) e !PDZ]|7Wð.=pUҾ?ZdeD½F D@+<v Ɓ0} ZGR#`FHQYB22B!b]&I٥E%*+Eñln~`Po g%ҍbJ8%XiuS>V5oPDB,T&B+ !1MA֍COA1 z⌒^Т<ɦ~9\)d l(mJTE z˦9ԓ}^Gcv_CvpQ#w(|0C=v\Qw& IuhB*ع);ŕUJmٶu6&{v60-U0l u  ~c.q$? HjyM+#7<,,Hd $k).T K N@eiPIr©QpTV HddB#F.sb=mBOI򗾰T,?RzZl.m֥Դ뢖]T枀;ނP;j7[dAeCbgCDF^n1v^kBǒD Ե$mQrLV:V]3mxlN?e4m PY]fv(}-%;Ϛ0Fg\j Қ1DaOŘ5 5DvNDʲ42T @Y6ϯksQq.d p&m<rLz韏.B:o@Zǃd T n()fYqG4 cHQ@|>Gd<ҭz.w՗ƏEQSwsRZ󵓰MrL;G];AcJ- Y":H%$ TA@vcd "!DYh#Α̛/.TlkbaƈuZtjy zf|inCOk77DܦɛCC"Pk/4fYKv. dGPȤmM |= 8hj,oڈ9K5`*6dJ*4&ixԧJeRcq dU=Pl$(b0LJ7_nO^W{*wvn6(s˟MjgRaw VoL%DQБBb9 ㆩsGG+.y=*JfU_h6(Vd1xdZZ j(/~P"r]SS_̓| dʜk.URHl@#I2(Y52XgJO)„k ŁE@&ZQ$WvJRJQʿ S.>|@űFu&\D;&{ ũ_hdYD T k-59W_OvD:/nkQ{:^S}:VIz:$:UXX(#}XJ5yv+ZZRCQnޟw7ٿYe~nUHp5ya^=D tN a%F鶐V0'4{4{#qQ`<[AԣujӿD喦H#BZi2X7nEj&ZqRb%(i{}?_kG_?Ɔlj$73B7NWWڎ9-~X2fIQm^KD Le'FTɊe-1(?Uy4O1hy b[ y}ؾUĐ75T hx1n·,U˱Ww9Qƻ6-(!v1 u1|8! >\À$4:WKa=3ɂ-2ݿd \Fa'Hy J' ƭkR* -]i]J/9D h5żp!7dòvF2'gG/Ӯߥ:`@eX=UHM'CFd* L̠-8"LN9 mU Z QQ`ąd FaZ |_Da*ŒzQV3HNTƷW>?լ֯6?ZLg䕆`b l޺ 9R> 'űEb>׵jȤ{闃pq@*:OBî"kxfY 0XhNFM d d QHa1Ntx")CZMXUjVZMȷsXmOy1+l+ LJ Kǚ4%'v1աo$T"7bڝ_$KZ E  9%~'"rX8&;<ۢpٚ$iNd>aLjtĔS)KPWUxnE %E'ew49a/},QZ3m (;@brBd<aen`o7i8|[-aul{eR#jY7mu/-ϗRPrx f:Y9BAD8@&}-7~LT9ƝRE'u9({8N6%ZdZE>aLNhzJ*ݔsYEw~jԖ9# ЅBzJ 4<(*/U$C Ť9OE4wm1a")R(i1!i` (Vsm呫j8. qCGر-a`PJĕGMbd? >(pO0K*|swe;hO81_(}?}Of&5lfhJL[hk:y!Nqx0* Qd2e_@k6А/C8 The9_Ug yw0&t0xSu"+7;4*^'s062#tHЂf>kXNAFدףƛ(*W>[yvjOt+d !TLj0tT3LȀ-Sљ.,ALui_Ozud[%Jed`bUEͶR֥^u(94/˃f@1YA'98-O4 ^+ #G_P3ALQ0dWd J|@)RO_w \$Uu9wj>Ú^''R9 vg^?~a^ݼ폎աATrk[hjԼOu?4UԹ$Śoe*⣐qԒm}-w;_?[(XCX@Dn/|Y4d F`dt0-My>TY?tS*颤x]dDvҊsyb_eηΫýQejՂNb_~g72dP&@TVv%Ud aF۫i=^چH֮zg>7 @ї0ԫ($ ^ڴYm <]ds F:l X@wp4h翺4hۗU}.H^閃2.R bĶ:<.Agu}\ա^]uS_ͭ*"3v"\DCx:/# ೻ИUHݲ2yЬMLrdE H&h,xNPoӗ\-߽-DFLH0x;#H?3"?C7Q+i|6|i+O]gfP\A&䧄 Һ~Nf)*;OX|&TÃ!֪LĘ+~,dU NH*aN|bJo#=>nS2jX>؋ý:T ,ᚤg4gds?otOU8 :y%;g5fq!czMh@H/]l >^먺8ȉٲza26>ۉֈtOd] rDa>X|2FTKxBl,JҐ?uk#ߤy6x5^ BwuwO7OG(M)>^`e#g a-ƈۛf~O*uJ :qgbC}MKtq]{d CRl@BS' bj5UFٔ dz H <* 6xzDRvWW ~1xʭ@uyܷXˏ%wUZ(p~\tK+oNodp2lٞHG@@9{507xnjحL-iY&]c&~d Fa>x zDP?]B`BJxmx+Y>j|ʡB :, \a~z~GߩpSQ:IfecRob&_)#5`Ek՛pa;ԜLhD|N7d YJ'6tXV/dJ+47 I:f @TP,28Z8*a5u}Dr/ ;N,ǝd6 qNhBiX h=u dZyMnOo(( .= kT vW1*sc.(4m,DPCbݬ=~Q ]}glޔXI] %"[(pX0:Tp]*7vwfrgb~zLtt KgG&RfEGDdD JeJB|FoSRS^ˇG@s`\`SdE,n]FSʝSG B$j`FylOʹY9ιuu y !+ɛba~5 ݷMa `#, mdX qHe2Q(OL"ACQK.rHئܝշ )U@T%k$t)y!V~شNnJ}M;[)zZdb@Pl45A|2w?^Ze CP,"1*̝:!4dl Fa%>aR|N? f5Gݫ9 tE;aN&_@+;U[Sxu fV7&ijKObͧ(UF/rIK <ͥ- ^~y{r k}̵)?ֽFv *p@y5nq˨] v`kd hFa#F:׬ ~I;GC,;O]H$'w/:YNR0̻'U:-=Iklz&PTOV̝mf__WQJbU+C=_X nlJ+Z$gL ߬ziK^.sa(,X_idFd qDiM`ڀ0ԗQ(.';f&?vi)h&scZg>`,nds豱Z ZHKce0vf' /;1,hQm/Ms˗t nX%/Ϩ6'&Qȱ`@: #+ vS؉u'b?d B,`|XX[JNGq!I F0$d>J,ڐ8MGA" KO,X1  Qizs?tPګ#ocmKtڔ?GoW{=1qse\(pbT&t D&(^'ĵ˿ζP+hQEjVe"-'dy}?Ud< [P0X!E=?WP?:]  S NA"ٟ5bj8jO-PwQҴoOWoO嚔%$v?2^4y8&Z&Q 3aWc"Ǘ{^UYMNEoє:t**-dNbDa'FX7Q:;87e2C3GyS*^] `Y^oIIm#j"Uf5bهչ8x<2Y ELo}J%TLK f~R ]Am9^ЬL'|eDgd< Begn`|8':%E,QKZY7vmh:<P~_Ȋ`HqQ_YEY u*!,q:+NJR$Z&qYOw`$ gLBSwQ!t& s-dv#RH IL06oWd UD`F¶|ČO#ZH=Wvm:*rƩg*7RYoK?{%fK|Xʰ($Vc11fulML T._^ו/#Z`~fOޜxsK]d =[D=ZtJFш16 V"XJ V<㓡e@H}Čl{=z:uy9^ tےP͖B4zٿ!Et3T"6V֦vJ]+~7߫OOׁ t:3$  |d Be%lDж˄U وBd8u9EZ?.3N2-C9خ`BүUR!nC\a*eI"]ˊ?TXQ9šsPK2Mld٧XW5(嗢-\Ia7)qGH@52|f,rm ˿ւA$Nu+v6fl[9IB~y|G (<7z/d T&sϠDdK @ tO8-zHX1ВH(m̑>1h&<--{rޗR6=?Ѕk:guUTݣWjdϠRRLU;\Bs4 A?6ݓ6k!L%˅_PvbY*X<1"A頂$PqQZd_RR Ǵt&8_7v%p@LRQgszݝ .d$30rX̨>­Z{NɓvnJ{Zd{/m?O`vw䊔<Ÿeiq 8\ġь\PG*qyQ$ 0D?J&SsD |X9V ]k{O7GzG%;rK}b /ΐpHUqO[%kxKP `x"4FS#עPvC7d6{KG%;r] /ΐp"Xo z* % B B( PLRl6^w֞BZ"-w1ޗd' R?<RD4t:Pc'(#Le+(&ޞA1сܿϧvoX}wCa-^6fscftU"O-mX/IO_$|oѧ|SӺ2Ū)] Aݫ}WYգ[D6 Pa zUNq__BW6/^N 'r 1n/W-EF^jP+Dކ G[dNɑ_Ny%^fA t^;PYzD4 P{|JTͻ!㲺9mտ(5k+,Lz vU\|Xb>U=UNNnX=8^RfdOZ9D(__~~-R'$LYx9>޵Q)WVA2hަ"qW XEjY^| hH޾d F|m[\RٷС u%4;sO񪥎? ftr3Nˣ)rkg" i9Y0W~"bLNE@sL,RA/vSfdРe͕R<s;7#|[d$ D_k@x rIOSJն9[@?Za=)xW%5<-˭hݕh+K_%SZVz[yod7 -D=ހJʌS?}e^yye?["=} 4$ W ԝ?)O(5ɟE Mۦ&< P9]+?^Ra/ ؜Le&S{R~F/=(uNCjŇG}k?;SV}W9dJ "Ba*(p`J76}%G&V̑!`2HQ,06T>a=Tst qK.bB%RCTQ}1:)ol|zb=~-zedRW 'rj"8cRoBd_ D=%I&tz4ivo]G u;J7qUF+Ԭ .ICX3Z%#Ѕ3q ;>a%A25RhGF.Z#QF\ժ{czӛ~0Hr4hdrGh,+Q.&0eds uD'=Lp bp[iw kwE®>CP=0C7s 911nv n{;9u,mrRblV:uӫx\Hn>ݿ&oijw3$ `Y2=*ێq4-^k&gBNXed r@='&pHKkG` &j.w ƾdu[A@_Fik6m߿߻dz[4GM. hNJ>H(($enlL(0Ow=f?(O̞}ҒuOy2GIj$~(La~og)GyώPtIDCuipLF|;楤U[K-14 az Cx&J p1>7<dRͬ38 tL̒?ӈ婺\hXia/."]ͷy橗_72==+?ކ1M&4ۦ]W s |==h[qȪIU-\ KyW/}ڛ<ܷ߉H;|j_0Ѵz>IDB TOZ:PoE/p0$%G 25M$W5gwdLjz3^[oCe~ w7tpXWob&frƘ"K>U=lmL\9Aÿ._:A?aiE*QFDuiIDW ,OX `DٲzJ [ebL+Q۾Fmf٘IǪRԊd{䢆s-uF0JuWqt_K E3ZFo_uowO0fF(B=kC"q-BcZ5:9hA%{QV^~E#sٷʘO)RtZ"׸֢@MV}5ٵۑ?l=: M}˰J~ؚ|jsX9YJ`6 B R<?d Pa"H &Čm?_nd*u Y!-W~A>#rwMj\?OG/ &@&`5S#\37`wMܢ3r h- ,8@ܳ :qxmi:πU5{Zlw2{j*Wd MP&k,$[稳_}?d J`LYN8aЋU{fdS.ޏŭzt}Ѡ6+'\S Jr H{ƝGq9!KG *x3p1!-6_`L :K$N춆*u-WjEx5D%],n-Q/d ٷJ=YjzOYnSѴ/oc(hJ(""55KSRK,ˠd=ņۮ9d,M#½v]߳lGd qHa"HnxJ}R5h}5ɨ!a; r{ҳi.[ERE=95O>O)dJ8@Ëj,\n4:HF4L5n]MLн}fL z/vd MF@Z~ Gچi węDGB)5rK'"tĒy*qY|}4ee"O>$Ecz iWgگ  VFq_D~eF|Mg.L5&R&>PRbO!XW'Tkd 1sFaZ6xЄZ!3[F=WnJ,-ENզ-wXNz_.r X)i[G=z.F]eg:,O) /yB?$/OrQV!溭OE;Θ) 8݀Վ3,) \E&>,,d `D<ńxzL_V)նFɻ:(G}oONaƼpop-dP.~kv}iͬ5Ʌ1˦Q%jY}1*UtG2zʂFϔ xE-$appO9R+;yUd Da"H GR6zb([g뚼e=N$[6e&Jڐ |'[c?Ѵڍr1WMߡ* 4OiHXڴLlP+2ê}]բ./tu4_ g]Yֱ}Qw8xŇRALT]d Da%H *xoQًV<>5OwhzAEMuRY;\,+Q=߽d}w2<2ko@޳h3S2H4KB3 ;dSo 计qөLB "N$Xfv+ؗigpīWwvÌ$̷od<ehc"p_J$pKH#p+Pß6bS|p)

a^xFؖ<O(/_ڪd[JKWqJeU3rä?UmH*1P [rT]1s^ˈkZ5ʧ&Q{[ч'gz(oZ+3ڬn;Mz(_4@9#VDPdb@aenpPrbJA2:ϐ8AI %, 4~']%` a|D< Vp daeZ|!JU[8Gu\UHc-ئȐJ{J{8z/9_o'FR3ҭ[=%^lpŞW\$ `eG]0ܵXF{Dq`Vzzq05in7QAV kl0s\(H{,f?l?Qth%($p1gn[jmRh8Ftjgm GS̔GY)0ceȿtׯT#VNdK ]uD=T):h vmuSuO*՜&r_B5L&dB=JˆPDuxiԌ_wlUȷ:$vT{wZIHDF8`a#XDIf!Xhb9 ~I69phP+;q>41jDd^s1HM^7{d: -'Bahp]$zAɫUt1)-ruoCt*1{,e\،ErР( QL؋vi]KMVszĀ\*"ҡA"} mYL ?* tR.}OHB~ťl垂CTPY/ 3n3 d8 d@:lX0A];]pDVX}[o$~~yGl g])y2?ϐ*4 tƾ8[; I$F4= d=wb7[:dkV1+;Nߪ_qgCճЫ+ @ 0 (u^4F}I8aTZ5}>d' Fe% вt zDVLFJmU][_$.B4|bK!&(,M=x)iG"p%ҭ. X~)HgQ;̐*PdCLPx:QهV"BFvv/龠d5 $F*e" pt yC?&0,#=_<"P1"Dt(ÿ+ȉfn<÷ZP3h/~?gd_DEew#PnTFQ4$L49xz$6" 5~U-,}~a<fotdM rDRa%t yHGꔞ^:B|HbQK0ݽ -IF,'F J5,;_}H?Ud!31*2I&m5ln8ezMR>gWYQfS]WW(:vWG:ݞF) Gda D=%q6pxƊOib {ϺV__Zف7ܱZQ}R2'nm]voj EZàx&,V#v3NF7' ! \$iUֱ˟BAhdu B=p{ P&=],:#3K`}6iTS^OU5_SQkot*D}opY>m *g{[{k=qӟ+ .F %d:\F=7}f::ºo!_U`{ld EDq6tOP2ѫ@}<\ۗj"- 5LO@j`[K 4^-L&#sjNaLB198ȤN&zbr"+q9r% Ǥ>gKfwD58nٓk'F3eӵF{iwYP:M"ə&dB@(tHeLpLȝh 8kԐPu9ַz 1XxFyUfn[?(d ]Z hQ`132iRY@\$h-:ŭd/&ڸft֐mz1^W!*u"y.4Iژ7*\ ~(iSWY(rvk/g{V,"Ky#"Ǩ-Ɩ*/AF UȀ NܟFb2b.˨̢;jP(sd; mRe$X r1%w=zMK^?v<K$i4u+v #)F%g1]&=A/|4_uZe^tThUIrk#lqZm쩂#$_տѓG_{eq.HdM APd8քt'*HvJJ\"8'-#~::{Na8dBΔTk>|:9â0nm#E?V+]Da @e8(,rΏhӏ`P#PWdQHG֫Gb fn庈w+UM)=|)M!i~n; dy HJePބzPhEN[%gkX,^߻-+"c[gf:t_T*l$_3|hVEhQ]K!^?^j?n_ߚ|AnЬtB9)M_tߋʄOe}QC8KY L?C?d J`eV *of&`2J۾4p:Ns׳*M.@vMTm[^;1+kKо2p),o#3_P\Z% E"E)8nH )qd EJxO@Y;Jŕ5lFnlS竊cYaA8n)Pg7H+Xp84,yO&ɆѴ%)cO7f乨IfXQ:PM$Z?vol> cMA~ NrrkepD`jA;dJZ Ǭ&(uo\nDPxʎRv_ɜ7E*ϟ9܄dŀ aa4go`LXKr&F|@to9{__)qv0[4aߌm̏?2Dw8dZ Rh*qpTZ#>*#Y^4iݿu^XK]4㩘5"w5a_-+^/`|G4<>L UdDaUP*^93rUcLdE)aZWoz_n_zZiMD[84dn d-O 8 }kEi~O_5-4܄%K,Ի|htX>T8hZQk߿}l?JH/4<Ƥ?N"cԝCr!BgomڑQߔus>G^Ql.bsZ=d{Z-砒;yiDqL9yLKfG&StR.Z_5ON[_6Ī@@Ң N3(8Il5DM^lZ[Z^mi)rs8&ʨL^Qh$X%G}JCmWԶdfJ.egNkyhQ+) үy¢gz#ơPZ -!hS0屭K-iƲ #<3#ħj7~߫?Q)?D|7TU jӶ@9;`2XȘ.he5l`^mRvh@$8d5zN/<8\ zJh{reC60(dqQ۪*Mf*ZPK:27掌_SH|e~t?mi܏/LL_32v'éі>}#S*PlyQԧvWOLcw8n m4K@w+m$<0dHa'FVHDILJлt5Wh !8HF,I2%o^[gʢ[5ec6-  H6IЭ)j5 NMo_-l[|*Oo*UN@wԭQkIxK/d L`;nID:!5ҭIZ ^<9Ia,!5 F|GoՓW7!'*9lkeLѬ)Nգ=еJ~ݦoo]gw G/o"p0 >Mڣ-,oY^,ӣ|u d# Ja'ڐ6HD G LyC3].myhWoS߷"jw'_V?_;D\ Y=Ϟ  gjܥ٪=' !ߖH|GTzeF5Ѻ;ʂVCmJ!536mYqs d: mJ `9y0O1wh}Fu-su8xlR[+tg֟lrU bb;z!?M8V\w-,TkT2O-Cyk?zmYu]dP H a' Va4?wXb,d BܑV֮f]Y02yDLz7y~091MGGB1cj{x·+=NgftGEW;o+GmOw%-> L RM3TԞϹuDf PN `(鲐G~쿴 I JM :)aK8F{c*gr;9 ڔO_#@GD `Ja*de{-WQSCQ%Š4xwpCǶ5J =>]K+8FΚb?wjښ*b([܆…vA{t;V\U\ς+ Ռ$s :D`p|oUg ( \bd J=%*)J|Dt⩂N5(R?0d^]57zp:sR<4F;OeKMiӃ}G]v M#(M!Š+^@k1ǞkxF݃NoUGĥTĊP?*$C6BK``d F a*)&xhZYYlXG1kwp&N?zQ> P8CŜ]T]zkWU~ThQ_Tb=@$nT|͍d5b.Ք8Uz?Ub@eZ*“ d HFa% txZDlj˾:{Ә0")w ^YswBۋoNoo>SV!@Ѹ&}%E@w i&8r$sؙb!Y?M+Pغܚ\4anCWVJZ=sI. rd yF=Z&tLr?e0",ֆ9R3TcVn d}Ugz|#]<2W, %ZאDq-Pfx [|x_Q/ypPqgi*WM_h92L@>H8ulW˘3ڷ(.kV Ԡ d FaeYNtPlJk &QÉzzCZ)t}uzK]ER+F#'*X6Ōig9YEAVn1P&(` ѯMtzJp\ڠAQ͵_/F׆u{  ¡RwRu>=UNmFտB?d)߶*>xF"SXf_Y_Է\RYWiV"p׺&s0袺^(D @B='@ހzNrb  F >t6,Eύ9\ȟ&MBIe[P&[d YB0lO)+;5",䋓7[j8Ƚeq"~?U hrtRW:#`!8% < ˖ZWG,rx@i&=q avZoe5 joXXXBĄCĠ5 l=AA5"MM,~0o6iw$ōdvF &8j~׺2ʍݏgB}OU'xwErc 0,q"q&44XZeD57Fb&.~v4\˻zf#1TAQPқi")θk6⃑v6g"#h}?}K~u޼wvBCs29UT.rL5VӰ|T5z."s[_UCu˒Y҅d JdVH ޥK4;5ɫˬg С5^o>r̭#u9]1JFJ!W]_!*-{5Uf 9m ͫW1 5F4dxCD'-:>LJd %La*Q"pXԨ]G_UAM__/лt9!@ vn Ɋcaك%j;ijUYYͭHKn#m<.Xq]Z %r~/_PHRSg~M}YY. oNd DeLxΎԊmO85J!+rvOyn4J<<9$Ynf``rGOmP1.~_=_ҨY*;U "D'"ha}1lyҌ3a)Y,x>ab&j9؈Y,mKd DhZ`tp#D4;`}&F9Fyd#me_?0w1GCm nD4a$Ǣb*?vWdã8{:m5M , %ԽV&g4V1Mupj IT#⟆d1Bi%ZxtrBUfNgLz3oRj~@1^`hc/ #Ǜ[UY<#Er"wMZʻsz=KdV_œm\uzd^eàp)0uOd 1BiZht 5 `;UT{C}-DU>1׻0)_ݭzo1{ xV u*hj+EE {d De^nl Iiu^NcMC˪^1$2?ԣxo̦_1A&3B@V%zٱn!N>W -ZQd@Є\3in Z?zu*_B dKId iB i"ZIVlƐ\P/ԡ|HQ壥ʼQjZ0Fcn+bfT۷udQ/7o5dSE?xla?D)!KA;"FdǞGn)+t1eLPl~~Kſj֮u67-9 #ld %Bi%Z6pф1*QRuYe4&FsJfvr?nCq_,:Ac>^Oމ΍ƏQ:gBMdEΜ /,7IJ=0j׈^zft[+լ?eaLN|Iſv}!H@%aqLd @e>tф LBQ%9w-I0b#՟Rgg=Pl2V8I]c2)u*;j{3&GwԷs,CUH:)knZ>޸V_bWfԓS"$*4Zv, RM?,#wd f@xZ0~朳ɛYG6 EG fɱdz6&j!g}ZÞ)o{lHڢjOIyQ[>e]+08ǚ;O}8gj*N:sQR+i0Ѧhq%iGPC2QF UdF̬ P $u8a/Bp5*ĉGNNSc1֫OY?e.BP_ٵoFzNu9Oڱ3> +>]O P0"h. 9gd($P.Qy gF4]W ݕ=oe#SD< .Jl8oZ켤N=%dv zSQ*s5rbCʼnoc6 D.ȿݔV={[i/4ۧ#K`CD &m^TQfLTtoӓ~)C-7p:&!2M)[d"U6&}GԈ]~UHM 3^/l?Ъ )XB Jl KXX] ys|F[jzT1Tcqw?o^?dD HaNtXR#[fl@:-VfmNfxIO5v]ݦ5EIo?B2?ҺH E Ĭs3"ʍjGR gUKC8TAg~1{s obU`/0 $EdTd[ mHe(xL_%(6\,qh`4aoeikL7U P])GwCg'#U<Qc}};y2B9oUSoOFgE֖S@%ӣyAI11X ["*=4GFC$dn Fa+6pt+R'-*0CzѺ*8Pڨi*"ZJ2kAmeGa&[7o٢cXEU<&K'&G5[Uxue~??,xNiqKF+vŃǭ@6 բKX~̓vxyiԲkd XH a%*I6p lbkP7ܶc{/M.b gҋ~$kkW3nJƝr,.E~VcbqV l7P bbICWm'ؽOUd DtZ0 ITƑ1Q݂J#S@bAQP#TX*TP)Gg+j6t-8sSի+]AEwr!ttOVI_Qqq@@#'r6!D^P&ը2Q ^n)fAySxXGdH@C\*ktubLuu=O"b&?B.ͪIۡ秄 =PGv`IJფ3 C2& M%U$~嶛M0U$(MIv~9WUYI0g#ۖNT 'DS|ͪߛz 䅦dwV$v B`CN伮9uz(ITFhЇ(025/rܱJ(۷-d# Hm'pxFlo*/i18}5DٕM7G}.ifnauJ.A92V.,Mp:?V k*NJߠO8R#<ЮZx{`>HvzR]_Sd& Fi%>|kVQ+c쾝o~w dUaJnԌ`rg!ͅbnѠIWW:=3ߧ7}uHӢ7ݝmLQ]A^P=B'rfp$-wʭd# fF=O >|p1`􅩚i5-ɸwl†tn'e:F5b0m4nE+Q"lk5Zesoޝ"5[D%U R_;K(uLkڹDB^F#Om!d. .H<8ހ 0&?ݟSSVRHYOA!)ǁNR.`^G 2EC 0̦cX9_e*Q[ԋ2:|-?9_"%XA s%T /WwFloANoOeddC FFj;U:>GuH@IET)p$ϧ;71)651η…"::EAw^{ J)7z6 mdz=Xiк ">Wb֕Çh =_*2"80" aGh(ҒA78PZԢh=6P9,QYʗmoFT[r,G}QV' 0Znt91c+%M<LRF(\jam]z޴2˨-Cvk@doToޕ^ Tݡb*Em3>(UgpwCZ辔nzVvOԦ6bJ Nb!5Vs,YKB7IT%+;G0Cy Jm:bcJd NlF^ P zB;:='{O5ׇH3nȐ L^GjKmz6Aɔ@42,@Yb@[5[R~m%iIݎgq6hM! }=µ T2p1@O#D".&//XŮp%d oJlH`R w"P{cg_cZ}M$Ar\QUb~AKTzNnW\ aVEU9!KOG2L;3DUf%   h, P_D?&UcIK "ڞ<' . I2z~G~瑏<$X"h1(@, aUDK(CA@fͩEa@pHPkAdFͨ%&8FÒGqfdy1X0ɏ"a;0G&{U#ok~L0B5SƂA bY5?~{c 1s8,M^K"2¥iPBâVdS+6TfU+,sտQ F W&dNTސHC tuoe7_:ܡQJR!z+D?*//UymNl@F.P_t݁\{PՃ0eR&eF'ߺrBIH6`-bpީ@-T WE_n\)cOtkaAnN%w1c˶sd cN+p HkۉR8e)QZڙTEf꿸\YfUv4wOd@[RJ ae{YnwLMWM\ܶOU܄…astOaJ6ԡ! 2[TոƗK-GtXd iH hG^hT[pqfp V+CSF@MyD7݉`uG{wj:CviV^$Ym<=Sջ*+7,ډnr/e=W T9˖9PKpd Fm'H00/GH׍c!)[t^kP#lP&"\5V,m;B,K?9OR!rLM³dW LDh*6t  }EGN4 BFp$?$iAJMzBܬs{kA*eC?bBaW4.z 1ܟ֯XܻSl.әh2V{ChN Oifhp2B3qaaW>=lb6i-dm LDVp[(^&EDt- T$B5eT bwWUA K)``QRb52;Wj-S͙B5ܾp_%{)pBh2~{ e )tVE~L(~ d?{}]ht D܊~dT$Ҡ 26C*|3QrC#uI/FS&7e L8LWWU垌>Bi;G^|cvKfYnR>ZmQN$sLu`__3D%G8ge'JPÖC@!Tԃ1Ee!D }V"ʩUT.-vG5GoV#[% F8L RDHH}c,g1t5m[uo_ST ~)P~!0Aב+Wji0 פO(EMtD' R+<%J"J(R(OT-숝?VީaAPwULG XM[lwdpdtǧ㰧K~S~.ȉΘ 1Sr+7hc u[crKfDӝZfD5 J`GN 2Ό9/,uhK2ܳiM;HF!: 4K+>;;G&?OE^Ƥv#G͝6#,ɶuD-R̿{yg_x*{XDW,=5$*JǛՓ'd$ FeF: JPMFz(3ZSM<S0zYcNizO){tޖ}cd2 _f + XG0 <ԞUWFQ&8(o}EUS7em"3%*kn\UT=Y: TfD A_H`7rɊh"Y՜cUv@+YT4M!m@L~ǩ PaGN@"]>)T%=̭gJ#tf"8z>v3Ԋr\_oMUdRmөb,MQ9͜('Ld He%*2|P*Vwtd >i(WKco}ytϡH$c<@(B#P'iAbI"'D.Fpui:2eg1^vt;_Z#J1Mz:s9bHO\ E-T3"J0g|T|d/ [L+a%n|X}]N2~T`;ATE,sŇcu! x*oM騋ʝrK߷ITUG$T{RN)}UanΪxv#tVd(-QӓcwU^U~/dJ _JaQ&xDn ͏4(4TUE~4 ]M3$Њ~Wnɺ헵^ )sWr_еS00c>WM1))M\KѾ25?bL{f>n&)y ]g@[D.4{@Pk ʬיQDc q]F1Z(O]qVuF;oп_ڔ!JmYԱ?P[?UU 餘 j<}"&)itAΦA?"q02?cXʢ)w \MYQ4ԥPM?91xkz'_'Y&#WUdu*J,.8BWTuH6q@w-J+)b £ d=7( ś5;S>#0`1K?Vrӣwgƺc n5%u>Kʿc76ZR},Wtqã1X! Jt 7B7"r7k"*Ж{WT l}d, #L+a"tDlG '_kZ4z)eA[ˠbӈ@Ūj}S)#ljC#գ*Y(Z>0uVU*l9qCNw4޾C[5D(5MD'WArD[oDB F1%2NJHao0}ĀNZڞ rdjGXtѯۿ?kfʝvOt hG鏹JWGExd3DQj 4' Ut=u>v,gO~;ToPXX!LaDU uD0gTɊp{cVXJ6^ ~ՑH\ԯ/ۺ'/GՏ7G?ڃߍˑ @5;Qw;]àӹFW V?|޻x#+_Wm٢rNʁ7Yl/7$dj =H`(pي;2[;(<*$BǽE??ê@.3 (ҖCh1Nc|"AX·g玟>wR~k+F"Ddp-KWI4Q/),kjѿ4q% zߗd_D eB$V ,I2OWwnڊUlQt7IcIp֎P[(6!Ve (hO*ygn# ro䐳9 D @n:m.dt.7$Q'YewdeaMv6:Ƿ$4Y;xH D B<yNɄHmOЃ -Asg7UPvFϣJzGWȗOT@FYS@ǂb>:Xxl4덜?6jN-yod˛;V]1'ӫէUh٠tV3}bŋ鵟D NB=%Q6ъp|9ħ(}>}[f␘I3zo_j+J#ol:.4(#!W*:7n^p7e%9GD=Os q`cdZ@$%W00?V rqhU=OA d Fp Z(yl\œrn`tJOG:Z7ECM.CQQ#~j}ߞ]?sͩHkk{Qt}Q{qb嵆끋 2FjAŀx0T@4z? 5nH9lW[zP.X!uTzavY}ɻ%&?!OUqc3S_` )1g2ՙ9Tՙ[iIauJj~Ʉ6 KYT̋?;܂4By5+0dg XQx£xV#,Hzyŭßn^]fQ$bRԛFf* .&8;΂铥#5z*0jRɞ,DSJ  !<%0^V ۭs;Ʃ\!r IRzQ;5k+ aё1m:d{ MRd L`FNXyڳ#)|'*|}5Ce y< wGSwCN{jZת3DLk ގ3{tW$5K@e_+$qU",:E"VtQlEY؍Uf(} /FAd H a*p(J")q\lDm2{B=׽ EhGi}vgD}>[gz[h 80_5褉B3nۨ254uQDI^Oz ?mA~FBr?qhCbҒd AJ بFXoe1ʩqX G`=w\P󺣂e Df?B&$ЫSy|]EPEiy d Ha8an|̐kYTCJA"/(pFvű0wWLEQ3/n,;" {tC^ $^My 9jQ4 344:&++?I$UhݛTiuVۈ_MWWyd oHa&NxƈV nMF3z7d}9{t]F)#!_OS)AL@: w(<%.%5J${0b斦ZIDXy.š$*8Awr8Xg !0=ۜgP&̡\(z v\%![+d MJSUQ:=T'.4zÎ*Otz AA߉A_-oy؊f5owݩ!{IHپ5 n e`RJ##hVb; i,ękk72>S Vd0Qd J*<8It"cd\@ꂇwbQ/}sY]ޯ7GWwo&]jԌ0R:D)#Ȉi&{YPǬ={we K@F%fD2 ëRIXPU dBeL N|D/sjADxg8?7eeꊎƐ  Ҵ]J *_(9ޟڜhYhzgW4M@qXEG y[ wZ)H<<'q\.渗LUC_}?Xd$4tV) dBeL|L]"mbo hz ;e~Yn*g bآ9:ypۗɦL3VEr*j|v+ɧEzWkۧwKG TR S`bdaF}&J L"c'.3RY! Qd@a"*p8w*a(WuSF[wsʪ/z8a0Ԋj~wJ[Vx^r;sЏ80{N]?85 ql[%nѽ҅V_K42u.YLL06FAyZ$6&79(YН'|Dz E3 \m]IdBa"Ll F5;)%OMljAQ/,fԟz!0MGC:bYcD5wRuoBINMc=HVB(Kc5@R^{;dqC+dHܑ]^[^e):8SC[!Ү#d~ Da"HFlҰs./Q(眷U | 2^ Fo_g=jkWˆӛ몊;0}.pYixwͼ+ sl?o1sIԂw{:Njٔr*&͔羟bثbwTsCdn B`^1Rh 5-7QMkq=؆ G"'ܳ+mu!A~by/VyDDb}W-? /'WEj8z AW!a (C<+uLD[R d` BaNh`HLw+fzñS,n66? ׮ Ǘ5\ati>Gkx6`GLcRT_ڟI0I M$ S; ܋KŨ&}$9u=\Y{iByԽ#bb51 BQ-J \d[ @`H:hɄ] 6k`巯R+q "- ++_pQк]2佖ת2?{ԤQ$:KViثJAj)`-nuT0xup@^BQ8`mHhO6m.N5PrvId^ `@ lYXSi`./ys{ x/;fb{W%ZJH(7u_ Sb uH7wTəEcxIq/ԠHQ(X),B(,NuӚXIbЌh( -=:W*B0*=Vk'mixXт$^SdhP Ktivzn<0;D`L$aRj̣4 ́hČ/˯O X;U#pF ;Vk)Ѫ!W]U%wiºpV>C7ӈ\Mt7['(zȘLX`lĈ2\+^R9QXs/zHlZxwj[{p7q& 9υ2] f쾊vey5d, jFe"tzJ˷dQq LWO?O~u_a* H _PP Yv9daqReғf)|ZQl)qŠ~{^ECTz eٓgg%G%w]+dA D  Ȇt OV D??k_˔s( jROppW[gkAg/>7$PgD7H S1<HXRć:P% !X!`>p6)hqxW%"W k&dUD*ǔqft@bǔnIjuP8|'N5C2TDFzs"u%DWDPwY @іd(5u dB2BUEU-# |Cm?sRE_oBſoMo ;hg@X"jCIO[d ]P hΜ0 <.D:%պv|0 "qP\z7˺_;,(HD_%P x4x9Pw,zRgAymܚ}?j.e /g~yr@QS=Ln&-FBP@0d }L hxY@ ,<1pDbXQeXyhWh*AVȊvs$__QYn0``af2`)|gG/< y'ÆfM=QD1Od\04*3/{":GmQ֧7~]r|˸VsyW,t7PvNs2Y~AwgdR3/C؄!K86`dTji e'$@J5s6*sΥ]\Ӎ 'R w3yҁD fԖܐz/CPd8J`c8gCUY5] 즼~Vi*91#$>r.Sśv8O4^d0<"?o;r*~{gR?qO7.jz1&51[lw*5ʴs"k/8SjWvbkT:%hG{<vNUo~߯ՕhI:o|X~sބXL d eT+i>&,­d?}H 7ԺݜEHt3'0;gNFB\EĘBpX!Zc*zԒS ܡ䤳i}X~EvȭL7VsSU R@',q,VV#b9 wQ*7D iP.<nɊJPIc9Pq>pLz?7^_ƝJ.0|@$h!H g4fT]uQ!嬄8z~'ˉS2մ_~o%%UB0c(k` \n_MA1_TzvrBD. }N"0nJHhGւ?o aĝd` tɌ4" 4j UuGo>дF'oOo'5*`h('NC*[aPfp Tz_{S ?sb]?dA ѷPZe% ƈ L}C$` Xx9& HcJ#$2;ꪤjPzSh~:T5*:O,(z.J؍F3jpq?x/][w̜Ʋt&\9_"/G jIX &,S"zDU `J(sӣ TVFw0jO{~ؿghd XL`4i& tR d)Ҫd![b*r0̗@뿎M?_{XF8IS(@8`l(x\뛊Ie=xo|k^4VtkZT D )f,[g+XD \Ja%8 Jl ʪЅ${0 齍:\u5'U-_: Eִ~.Zl:YDq pR Rt:ZZs*TȈA=Jc$Au:. M `bvȮ?b@@ g#:Aq7LV78!4@jڹd dFm'8a"t|̣̣!ā4Ϛ<Jo-|ft}sV`z$P1SR3 ?L뎊%QJ|ͣT:> v.>Ect  l8 *[rOn |0 [P1d Dm:VDtsˠ$FbBye>֯#jYoF_oۯ[(tг#&/Uթ!^xF{{d iDlV"Jpok AۧD:5&6v qSt]'زE҃А k-̴b ^J!ͻAbk}+ɐE=:_0AE4K3 +7ne90WY8.:Oa>:qd Dm">&|Dpu=[[}K'ΰ.Sw~lք@ Fܸz tOUBNFŦ>*fKb|]ۛvF7=mPzSC&)RU, oId@Wh{ʬsMA:==Lu0qt]}d Fi'8tDʱAJowM[O;{lx)O+`z_hDYZz;[!t>-%QߏaCqtad"zE HKAfhhKy9@8!P%N%X}d FVt[@1%A!E¬$ ɍBN4@i>uV{e8g7cKU]J8}sp_,~vpٿ~|2^}8~G=SK<ֲaxH_w'0V(Y%pWzuȇdBͬItxXpM~s߿O_6Ghk!j?P@0ǖ唉"n٩[7Ez_7,)L JRi??+/heB9E7 ΫpXfkjJ"=vY /sr)jNj5suE1u4NѰڂ0*a6Tq$WSklqw ʉm4BN st)V\I4)S+e a5*G ]Iprd FeM@x ta授l6Am Pzz+|Gh4W=oeV~~oznԓ .-$dF \E  兀fsײE1 ]{XubO7!6"nѪ&nwbD D 5'ވ NTnތj"unB S[F$l˖/gG#w]cC RU`C70'}Dr4HH/\˭KBЮպ;UnSH^^g3˿ZD%SB{OM/( @e8,ٙ_˩ӗbz⡊'O(uoSQ6nd0 Fa'`x߳#CXW1ekuc >ײ s{$11$Yp㊜&2W>NSZp)]'(ّaF|ϛÓNO3UPm$Do Dǜ! 8d A4җOb}+// FDsʀ pؠH`oA 1)hL>%;aF40Mcg0p~s1.{FnUCy߫k<(k vJe8MXRզ~ ABq"( d& J  H8NHVSm`V]@˱_ChZG?ov=?;lhGw%lp"M9N! ZrX C۝B"u+2H$,{گgPPcݟਠTHTlH&a)PUaud H *t@:Ot \ gM!󸏞+7 (??Ýo}_wwۡG3~$h^dԦ9%<Ɖ;a؁k$zq^mKrZi-4 !9%#0/Xg/vd ^̔Ж(8x]}@B.oҨwtpDy gI}wވCU]9X{l @CNt?@1ꄪ Gp蘌V/A(d*d" RiiqƘ),؄Zٛj@~-wHeW_xg?o:4AOҤ^:B!`&4Sh;=#e1ErpWUyVugnwu0Q~Y"hW7yWD`+|[7(윬{+D ]Re eȌ;a%| }__e?VT00 b'tUK˄ESgJ.d- N dd!Ƙ„1w/MoFOo(t<ڨ绣؋*99XH4Svcv ujmy&',ok ^:0upj.ЫV (@mhlBCj?8,6-;Gϻ6dD }R.aiƌԘ)j3tN-sAq+ &/Vwǜ tBV4 Y) .:: ٽd(:,rggXM*n4gWS!{ݽ(*iad] XN aJ l=8krB3+7馩oRD`^&; 햠i̿=nuܩ(؛5RL0YYT?~k]֍olܴ G5Ls{U\3S*dr FJe'b(ؿ]7d,P{(g]) t_ gmO؇s*8>匒e޴:ZҢKp4ur ~7@d pJ  Y8YF]Y$ KZ{_SqlPToh ͂ W8 v)*3UoK]ϊs{ dOd"n,{)0 E%V\omrZ8g֢d DN̬X0I}5(tBK"r:.S#%\daVF3Idɣnf&M h%2 dEZEt柬9ԗ]^PAA u%z-047MnpK}$ O..:*Y- j㆜dа$WzZ*Nttq6f\^DOȗ{]KK3.JF;#D½HA@=WRve%;ԡa V^X+ƣ]T-9kF#PRC}$DD INI\k9{֤bM:fK ]Zș)f9@.qd2_KWHy&Tv}J5}h%uV*}y$闃z?&T\AoJc *\OKId L`d:b)7"Nre}܃[RLRltԹ:mbm[ XHI 6Qe<7.d5Zk⍗MHa]BN ǡB6ԂA1 .> G9b4e !2D- ,N=⮰dx3#zr%Ze >밇uV>' &=!++"qX.-aQoaz3zAO~ 2m Ko'=Y`sv*gh2u-"΅`/#5-C,-DC J='b60)tB䓚.[n|ڂ0Qk, ΣSu2*^LeՓ!Iֳ0 WٍٖG.U;O29}-xEL}Ro<|JCWlw{6!fx_mX|'z.dZ ULڮX814Yno.X5Xy6ko8)zOT)C끔_D.=:42X- #YdVu=F| gj LzF,VDjEZIԃ?L)R+j^ׯdmT4-(y AO̫ZNld"z:#E 0qqu2J42c@]s+/Q5k|'OveU r𴱈o('*sO}k8iC*;z W"uPTy߻BQn}eg_?lgkdO LPɚ8h]r -])]:zIYo ETrutUitԿ[~o&CMC+$efb0*D9%q&P΋ک<9 ~eNh;Wӳ}7묜 0qTVAzsxok[dd dRXP \ΉhP6"ߧ،; ?*/Њ `!Xdnf%hVp_zel= &F.uDAEI:IjO% sJd؜yT3Do!AffdwN4c-htrPAzzw_&  dabrOsuh8Z!HfhLKRH{Twy(V}O}jLi7kcw~P(Y800܋p6x )0WxS#eGUNd( 5`ZMq_.j_YﭞY_GF7|KXI Dv@ݎ2?J"x.nRKRI ek#M~_9ԕ#otzGSuj*("͚:[KśD 3P4{PgHmb8\gUT:aOjJ" ydR7SjտE Knq'b6>#,.n2󞳽'L4@1DŽ&4ssԃ8(M DȈYM?IKQ !H|d ]3Ndm`sF8CM;Z*DVwuiĐ ֍"'}_ʌ 7!{_J6?4K409c&1_N䫰 4l:35V+n6#LA_Ep` qR-Tj^XId Jemdf~T,f+80?;Fap σd|Y׳ӐPaMH'~ߕ;_7-Մx8('jk)K0v0Vwt5d# Nhjb1.1 慟CȊ"l>r?Ģ]/9 G{1pyCN]roI~̠iG-Eʩ@?~ik_e%!?[J*\5+$j#NXy+lXY\H3tX|{C5d? T"OhPhEiS(F,H)./W=όTˆLBF lw) *Bp 0wF,MpcEJ(ķv~yw]G:=ֳ" T0ig-vW>\!d @Z"-h,Ye@^jͧCմukd;?Sg6!J!;9S9IT&RͲwުp}֝&z YYdE T'a AW7bґVPv'讕A=6 "Y~\oo:Kcܳ_ʬQȳV$!ԶNxҙJL"-"BC$~BLxI^z,`nUGBZmzT BVd[ =P=Bnn{40oxg5HqJpP|ލ4/#},Wv(WGj`Jnt9&Fg{93s-%&̳-ӑ:{L+._YKKKh"R@P-\<7]do N=eƠDzDSD E~_o 'U~d{+=6QsU7xrtR!&{oaB>T0&u}L· D?B}jV+g-+i:͹ofEw=un+7~Nd N=bhA2&yDȳ6NU +@ژbubNLa H8nNz:bIQ[?F[BD\x8o6g3fmAӔakXڄ}??:htɻ/};b" +d R0hʌAdV.9П}L;,3OoaҦ?>wkjy8 N86.Q^3Rk,<å<%7]QcyœAދ_kTJ&C7)pL؋sId 0}R+ʈX8Hd\ƚ(Jf^cS#%5c:[Τ{uby\*Mֺu J>pпzn:L޿' u54$zKfl-Ni_pv$!_d dQ5)I-$2ۦ)+dN@ *ɳE}&q\>`nrl dܹC}4ӗ ?5 .qՁHК'ݭ~jsA>L021'wU$51TA"YqݵjP髏P{OsDYY;R, h io5)XLP"M̵"j6G%t2H{Qٲ]PeɋfYա-b)1e@f<=mE֬Yˢgԟ]ig[RD'WE]M,GU šRG YwŚ},Ͽ?c:|3^>d^ mPi0D"^5L,+ֿ8L>M'n'DwAC?[_H]3j ˩$&hEw(Jo3Sf6tmWhAV67b)`@6=@wBLM|ɚ 1uCո v!gSredu 8Xe^ڎ}I_n%S{ʙצC9\/[\C%G!/f@~yFxکc'5嚟Q[A=HJo=vu?b}]>o@h IGQLn5 _(m ={y?H[{d /TiB^COü"ZY)a Q:N.EOFtp[u:NJqo>NFw C\S&5oz3\L4w!hƑyxkU/[H}&鱳6wV:"  `) md APeX^]ܼ7(thgyWM_VP)_U՚K/o1-Ts'/v^o** 9*;GĐJlh1fGM _`..7t'f)mT}d鞿f.nyRMoN+d -1Niz^}x;=Un[U9QXf"]#[kZ.;Rk_2wS=OH"k?YCog q(pČG+mDvwn>"/}d I[Ji.bTl+D*5#C9UzeL~|~p'H?%_S_Ow%X u @4^Ki m隓ޏoQkpm͈-o*sW)8ILBśJmeMR\/,H ;=;Hind [Ji ^ ZPr;e̫Kҵ_2wȾO\By+>i7 <>I8Y %AY)?rߡv/Ȫ@vņ 6#K Y@Jc/tQ'])jw&OTi7d /LijZb^TKtGH6rZ}>ᎳјZ Y^Q0u~j(\"8EXI[?j!sC$Zt0;P!DF z϶&;5/; yE䇣8U/ToS:Tn_d i/Le*^`K̷j;WIk#[eC.:8MBVhE2؂7Ғf\j%[A={Ugc`7"şU? 7ugjfa!`2@mRIIvwqNfc cw> d /HiF ^Z1Sģѕ_>~*cLBL"t#ұ.9=L%:$-Z+dR7WY` C1O{Q?|] -OaA'YnKK40j#d&MCjR_Ba}NCsBS5MQ6EԇZOA]n8;nw7EvgTydcNZǬڪP(C~Qn$R='I*3_\nJ_Jw)B`(I.R.XW)kA|?%}-ѩOZ;W6rrNaf۫_O|Ҋi Ƒ;;?_ 1 LY9 ?6Eb}d QV*Ƙ PڑBn3x3=5Z=Y4fj)So g׍0]wi1 yXƞR/t2mȎ)Yn$ OR~9o__?C* OWHAI _ n\~d ^ P 8d' Pd| rDp9A /7 7o7t,nox/Unz?t^+fQ[4H(J85f(LO~c )NDes-jWisϒZ&ys F<4^K:~_]niK΢nӿH "&J#iFxD 4g %F@⶧P޿3=rius hY?C֛ʘUt ԮG{& RbJ\h̵ǽ?x_ĐXj)fdM Lep!~:)G3YŔCcj1JonD_;U9KoS*7]LZ# 雷B"X'jYmoݞ1\doU/P19`5HW[UM['y&dh `LaBr-7$3gޱ0؁?LWߦq Z Пw#6 W@7[u-#VW7_W[PА @U/, ^`HGE2Ʀ1F&byWd TL`p9@ב< "Zb #-bܫvw/7mdd#PTΫ ~A?SA]kj0АAL4",r ߹}xr3QCnO9_]tmw$F d LNqX(U PP`ccG R):EJ8I0Y-@5D3d-h5v:ꠒwU\N:~N0I֋)^ւ*^uyIԣ- 0"6PQgYoO!dM$Pd!V̴z0o0HV dA2My I1d!+.MRZ'֓$%ufG]&* sX<_R X=Df |N irڐlj8(gVbxIS[rp*Jؠ"sf}iIYO({S Jw?Z;fOw,OH,(d }b_.1tg\ghh.Dz hRevޘLrJor_V?m MȌ'1S08$%2i&BʡSpV^P$.%!oSe);Ccdm5߾UV~u9?'0dLw_"-՗V KEJ^ "@,"4ёJ=dJex5v%6P9oESz_?_ȪDJHӐ|>''lnEިZ-g8os[FnP5>JUvᄁ,ļc1-=_'QWPC;u:pj a(62288Md Jaej4>h:o陙'g\lI*c8+¦ Ѷ͆o`n1>@k wΫQ}SI[>WՋG茡Md(T(*F[J@4`n\# 1ׄ(gXZ,q rƁf7NT Φ"es{6/?W3,*fE@nQZ@Qad {Ja9n: Ӯ4Z?Wn X7\@L1kNۧg*ܥ`". p]ORcU%W(w:2D I ."]"ǒ!̳bzxL`oWw{*w2=!#|*= Z[5nP@ /Ep0θ:z(?IQD~ ̵XiĔmE;ImHUsҕt@=mBxUFʗ <,~G{~y_2wOO/a9=rA_uk& "[< @[axgW#2Ԍ൰纂gqj:Hmod V="8YnTg~O-Bb4T`l\n   sd4sǰ΍f{lAF":ș DL+ JEmE5S] j`_T=:%H-%HıgpZק;n$5N(d Ta8Qn piܿQsA!hN}ζuy~rYڒo5=S,T VUc̫#$f-[!Je#!ą&}C 7?Gr"_P\-YHx}d yVe: &{ H. /9j\TY;D_Z_VzUԷފWub/ecm(e=) Wt<@Pv^0OCu$~a ѫR&{? M.~@[ECd RiRᾤʤ̵WoVt2CZ_ B yBS+| R)4B0 "xOyMw۵zbߔb>oVW2BXA`* [C;| C'0N~iLF݂ϻjٹΆ uWQX_ZD XRe"TVv=?_潾m_՝Pz0(zb,)8ZBzCL>Vn̳w#NXÅC,~>8gўYd`S: CG}40O8߷$)ZԑI!k?Uz+DW7 nIQƠP/4W vo,Z dm lwV?2$8TLuum .+m(rR\JfߝRH|u$@K@¥z-o"3Zq1R\*[H7sH~{`+?%Ks.*۹UӢLO,Z k4e*oe6˩AC-&9>鎙& aM:HD4ޯ}'Od yRY2z%dӯ,T aD@wQDktc;Y [︘u볱gGMSZihd La"T {hrS#~诪.6`m+y-/m5M~-zK_N_^㲕X NuVy.LF{1-X[6tu} tl]>Cu"$#q B$ʗbw߈7nQ_*"^d eJaZ N&QCz)дwC~ڣw`{ ([jZuUh@(=NȪrǵ*n슊TR2#}?bU \E| 1&#],Ź!/W9'iռCywI\cݓ /Z:}ڟ֏HHgd Ja"VΦ͉"lQ`b5_E: juwBWJ IR  @l,NN5eB=Uy;&(XƳ3]4+_?n/r* %N5Z_`G!NbIBv7k>wQFA(^*evwନggy=4Wc?d Be#va6Ekt8cFRSV6Zh'H=h2CbC'=X0İ#?oOe5?u{?OȢRd*`ђ |Zqn{ESMpRg/H$E ۲*jd FadZ|Nĺ;=)j;\A5嵬9m ?? pa{ttZSs6| Is?=L}O(>Uz0j])eJe4$&z]nb"\gwqK/*J;*l d lDafd:|1l`,,aSAܔ {OIR݈k1x L9n Ah:Lw}([WڦXPƀճ@tteiU ތ74,_B JC)DX%!d Bed)6lQ@Ah(]~?)z d1[K*vV6eEs5qmV>MËZUbC圳1uz/`k<|}P2"k I}()yBܡJ3p`:0`0U\0T:/` d PB6O8^e&AA''H2Ey!9tIUF.ਚ)1t5idLQ.4*4 ih wY ,隕Lݟ>FԪ,z æK_YMB`hN-2p:nfoj_R ɂ&LhN"}E`*Ud@f Xg\y|ȑ]ŠPp4 ݬDT. KX9!M&jS7V99|)N߃#b{b>M Ojo*j<]5(EdYT,@0\E{.jugR:Y?~|O[ujafo_y[pS0Kik%Me>υ㄄ڴ^|k$B'g҇Ue@^Oiq[ Zdp*dJ968cQb9U\Єn]JZg7gj%ZqsI:lw^-5*2*15~?;tUzߜ0pM䭩<)kⳐ-oU!?5GI}Vzv䑝G5 eY|7 3`lj)vd Did2x8bޢj)L\W5Kӳj#ej˧}VT,TlqE*T!.XƼx%~=QeGOyBF:OX4?}K,KT6j+''t$d :D e8xhD}fHcgFi.. tֲȴTT#DF7/7_ة[ً~%m(;;ye2uקo'N>1H̨}k2̿s<6 1bjO[pg`'%k,PTM\'\c" I^rg˗0[Žynyd5 F=d92t t^*{ϻnTux E1GnKi)[92ZiJ46=N22K(US VҋdQWm*cnΡg w Յ{A, /gR*"].BBLJ>_҇_b.f}MdJ Ja9 LKfj B7&VXO&; iFk(|>`z>?:LvAӔp'9 /GlaQԔH"&[ R*+yGPpJZ/QS/aݡ i5zd>7d\Li"4+olL U ӌƘP:?* >?]OWJ "cЀ~b b4D_vUR X#LVKň"!o3?T]35Xr7L6 1<0")ɀJ(t1Zb!=S_%dvmJx \HO2;tig{]$DQvU;n9 a[O0D@I! r%Wy>Ic7r`jcU DZë 5Ii) {hHMP~nMYkXҫl iQP`XsVYّ)߫/E,[$%ހ?w>''GE_HQM[bBY۵p.*(PZXRL秓Yט%[^gBdA [^ вA`~U^5Y_H')oAfbTZ}!k/52EYYBaӛ*j#dj Td8ބVqc$I%u bF,f3gu+ ɨHltM-uUa3w Sm{r.b+c(f4mZѧF&uZvhF+[$HQЅiVaxL&n*Wqnc=׳d~ cPd6xb`h><+l6= I2InGh5ˏǚ_:AuvVJd oN`Tx ?Bw .g\uПt0ȟ8O)Uک*t]6ڟѺ/_{R XP@PAFl Kջ ڻhX+n[~+G+_LT6TMd Peb9ȮQ )') L2SQpᨥ9 }dB @Zܳ2|}uxҍ1dX +[Ge>Ҥ@ tbGrsބ{QՌRRQۛ돿*C4^pQ(NL!-hjZ\^%b ӵAwt_Uh?_bF0h2ԖME}]ɴ(Z"n5]eM[^RYVB7aw:R\CBH^)Qk}Ʀy FKLYg_mJSHd Ja%:Fp{}2?h;r}-gt@ 56S,zp@OE,M#rזvW2ev L (+P@bXYC|%= h`n^/1.O7d.V's YbY7\aSd U)JO\er\z2UOݙբTڗn_BnR '`З4/;a0b`E/)?N߲RW @7C10$B @i`TI}K'7b4Wnέ$(\1TtSqَ.K*C!o>^$GuMTZ%.Ě\`-m~d ^(r#0WzIJGE9"t:%MTL5>l穪c4Rj]}K/ML8F-Mc2zkomm^_}ӧk\ASo__Q5v`WMj\mI+d V.1%ye'DwJ7UPL NxJ_~OAIGz[_Wa:!@_JE/Q+~'Eĝ`nOoO~^7{H @zq03ԋ5d V=*9ʐTdժ]&VP6T2qr(F4GۣlU~uw!_Ÿ\ *[AoO,BK,;4TB9M o$Ӵt\*=BVzBaP|QYH{/[d Rhg83. D t~On(i~֣'p^981sY{ۯWo} i «\xA*tTs`m0$ݡS[eRI OqaٌCnoR{!ӤX;Z=zd MPhZj eJ^f!\CSZYB1yt~?eդ󲏷[ёcLeɝ*.QF4,,CtT[]+8?G]?>o~"jU/h#sNv >D YP0"Rn0ъdJ'l1꿓TOm^SVKT,$AyT1:&FßO%@=nu0JuZzw_k_s?\n_?o;u NFF@AzF?cvk?_H|ztd- PanDjx-^%Ӿ5oJroa'*%3n#E"\i *Љ7OZ/w|_=-u*L A=Et -V=iXJ1/$@b!\]4!~J5DB mN*<2 ^ ,HR( <2TA(U& ~xJFeL8 |@{Ky:`1Ge_b J!k7Cygx`aB&(h1LPoJ/.~E.G>?ݿQWfdU Ldg8ɲČّe ^΄ixgVo_'  LO?U@2'(IpNDM?I=2,Aň $yFFΫhk?_wب #"Jn=1di N`9Ʉp!>US֒Ќ@IJC@`>poj 584@F&x peAzvt4^ 9:g)tBc@W5l 󍫂g ]P=ٱcϻr&5Hy Jh0\44s:=A 9=w F#×ٮ"A/@wO_/1?(4d Fi%: tJaGCzHv}v?w8t~GN QXNvq- vHw Y!}iGB*e]_=tM-ՌOF ݽw"_?5xqdeo*Cw?ptd QHi'8I&Dpƫ50Gse FCj/"ACH"L=ĻEMslWwO^88%Y1TNN*"[o;mіAeq0 6vw_2QBB5M(dM>9l\Wåd D"|[8&FR`7ouuo*?ڔɷ-%ꢲF:~M$(n\wW7]>ƍh HM8RK5Ht8@q%ӈ40bʓ57홽"PH&"`TO@rDDUml'IqXM%:+~&8(2`@ݽ δ Ējj[z6o7__ڿ v?{#60SMdp Feh8ڄjFgi&U{ NPZ$s~TOSncw{odHa"$+34.4>A ̨#a7tz@Q~oc6_O^޿_O ǡ+P2$ԛrVU^UM/-<( #Sdy Ja42xD[+Bڀ6op0&XhҘ`b>(¨\Ĩáح3oCc9~~XRhi%4T a3~΂i6yAJB%F@ډxd YFt Y(ZŃTM}eh25pbD*LޯY**Schh4մڷ<13[vvSfٻZfR>(ysRy61FC,^i PQe4!&f¹-* fkdI 6_d>̴pXԷ7_uQ냏ڝc/twC} 0"L0YIA"?ecO֐;Uz&q" L &#<]%Xi61˽'"Ϛ*BbI&qCľtD.莳: hh]stM9jOI7dZ ,PvA~G|q ~EY`͚X0)=~[e_-"II$7p5&2 ^˼2 T #}%Wg¡ QI5tVSi2z1hOH |phT 2\1 d uIT 28boVW;Kx8?<>Js scG}{i{cahڍCo:Ul5=`WUdpTnqcJTmes ˻/<5{LhJ> Wp?; E Xa]g|uChSIj)D Ni*cJ6 ۊ! QB\*p#TB7OΕn( (oɓ~OV*4sI "( h,bE:mYޯ, E풑kyWBϵncd;k,)=Kzxו9U(LC@Y|Ke?d :NhlqVɎįԻ)8WsE"' }FRY#9[ 뀢c=?j/w甊J 7x@1J5(x"Y_J%{Ɨ!dzGQbr tr!%!qB5&t'FՊ[1eigUD 8Ji:9VJh1 OEQlEE:_?SR}Yl VqŋP6UK~7,Ye/O@y ;'F h\l{?ET_԰ՋRA\!w_Um KKRE0d `aPe42>dG}ێASa-o\Z?rOo۟,9(kL kA&,jA Li7$GM&m֬Ȣ,]tRP M [zWՀTMREڏٳojZ=F*Xd1 pP `eb65wAՈLA^&ءF  9 4hBp^+"$H*_ZPXRZlnc]탏F` fC}nUb?XZ4C[E]ŊXd] կNa%b6hxaf LTYsZ d\mz IB֕]b01fdIa&1rn@c0;0)d'~a$Q%)(&zbN?hhn7<ܗBl֤Y0S"- Ldq Hed12tTX$Y>!MPuE>ZbC Lo \!q^xv9Uitz*1!{ V'dL!]?7|zT2IO~A5z3W~G̹Z8U?*/jDNSaed He: 2 VaS?ÏGdɜ$CWK48Ml|ЙX/m͒>-DnЏGaѫ?ՉĿ]("E&mpGIw {kTv+)X~>z\l_ Ѷm#§d Hed 6pA*R-/`8G>R0#t2B׳:#FE#S}*>u4oҵt*[dv7z:7(@gJHLh(O`vEnE),'&k<وxj-{~T;='a S#, c(N68STD(!3]=gd FiHQ2Ȉn?`Ҍ Dhe:6}+g}ޅRjF37e%JErC]_mtۅh5ƀVٕF̞鹿Тvj^aKҌIV$ZϦ"~l@JG-G-6)V(E:98[_d uHeH2fkչnow&AL8Z&Imʥ"pF`ܸO/5^t:TsDZ}Z|[CsfVD/'2w0%$](-;hJaj: |CD =B6ZPO.&[)Q1bRGcSI[kߣz!3kwJ<[O[B`( 'uH`GRs?H )~13$$yHڏϚ@j(jl3K>LI\)H1Xiq6]f#5MR:C͙il3 dwNN4zh -uoo鬔4Vɦ᡺`„KX`7s4#a/I<-C78ÔI' Ǣ=Z ͯ0ݖj+A{,+'v] Z.b{4AmO^zZo޽)Cjek8I=tQmSK{بnm8Sf|=+*d Laіɕޙ@x}Kִyr²n^8Y(cǙ[{wa/?;ԵU~jXH{*XW%JUY,)hՓռPkaFj^L3j'XSm4~W͔(5"XL 3Rrd DP aip񨣙G`iǒ+֊lKVBaa(,\?? `4HA-p3` dFjpqf߱x,*R173CKf-9}hF%{=8A@#(K YM( $#** !n[Tjd KLeghni`\g5wj^FmoM]'3ܿI$_++4z_}ľ-KDEaj8 ;TƮ"}>ANS ~ARF7Cߕ?O=Eץ&!JK.! V EQ%gGh]oFPD+ HLe*bnTH҆uעW3˿yJvv+tūz.*<*Tx ?>Ќh':DQ//k+Ż~'(s@-w9uTSȱu#9 3^\ޖlPq7ң?V%ܿdA Jaf I}B:$]_<.xKѥC)MZθh4pWѰZ$)$ni[*$h81"rCoK;n;Ӈ(x?d]HZJ16H )R+)UֆWĺWWNdY Fdb YW:1 M!HAHWehB; e"z[nCzn_}~lz ?C?8TٙB/_%q_rv5%o3^'őwۮGƆP&Ň5 _Ng PB5_"վjM꾋ݑ-9BC!7v{:7h"CEY&/(4IJ[Rd }Nٚ Ofz/+ Ta+u{EDXd`~E+ Rp:\$j\C"'g V 3Z=.I%&iQdܯ_Ѽғ ]Z4=)?pܠ}8Dw|GtTj@>n=U;\dTͬ1rPA&選58R &8)fkUB:L*&ԥ3,ξ70ݎ26brp_c"b4aP4UoW7A "<6ӈ*<04>=޴ 5X^r&&_hJѿش]ZV۷|bhP@dc ]N`mAhejFdN7}XV3UWoG{?3|O~PC̈i^4*h>Yܟ1sp2)G_'5} ѻ }ꙙ;7?^YM+đDU߾n_"dn LaBhRNķnt*/LSALoN~8AG"3#0Jڕ1v׼$`X3O#ۋhбw=[w?~}_?#d$!)SaaD?iMN49, F5d{ YLQabypWпWrY7;۳MS!O6y :Z QP@^:vǐ^uwiLvT~DdFvۤފޗu~"@8-R[f-?\V>o@aC69 K]R@& UYVz-{9cd Pae8p8G M"B(}t;FD W6(0 2r*ZHI]NP;?,rs?%7z أ)p_Z-Cy vz[_%1;/^2Uwoi5& q2?o+QO讅CT#D eL0l pW۵L'lHi6i}KQOotһ_{jpl0jbCuJpL*oeի${H~V+r&wgdm; !/9/EUs@lOlNDGJL0# \d YP=' 9E0j)e'+CO=s_Gt&dT؊ɂ I0X<^rM=׽->^ǸK Q3huN5ћD^8"9Q|=C°50qicďV?2d006$xY ]8Yd \LI2X82q.妶`D ddPtzN#1!k{vz",f`b_HuF"kZ3'䐨)N"21edND@@Ea&6\5b8u]*n7kO2Ϡ=S5jd0Y馚ybT3n֥4guc,Qݙ(|kV7Ud j;Rh@2Ck4pc亟GZnIGyT}5_W9o*RPd XTi8)T;l:15c9+>.|'g>YCϮ-i%޸V=;*^rL]چQ-Nզ-a&7P"tÜ+-؃bpu8њsN.C[۪jQX j\g#kGaZ0Id MLm!8`LЧcD=2-޽ڑc;."  Aa fpbrTt'7_]}ލ᪻x(k"l+ޟ>Lt,fBh*V̷ qޕA;d ȷLm*4rpH6G7JYjh8Ӹxۈ^wg=^Xk#OD*A `R(u3{ ejOP"A7?gbr o U#&h4`ef0.Ѣ \.SD'daMPBdPHd J 0˜[f(J@Шl| >o#FaF,l+BXW. 1#q ZLs͍O+)t7e~}Tn 7Rʋ@rajիYWi0' Th\Y¢YDSU6 H)[` 0,IK H z<ddRNV U Ii$0ފb&LYRoIC`h阘IF_LԾs]s+[i7 v#YJ0#(ٌF0;&)Ь¼2uCp6*(.NS"I~3Tj/Rl*.dT QTaِj}yoW=>'vK4kK6B[fEV˪CTQEnWA}^KDQ!? (oi,ܥJftŌ-xGD2ykfШ,ٓxz~_ok/@dW 1Nh:Me&(G ixQ.*,J>;F@ Vyŋi%1?S/蒦?KzP{>$PUe wwSuSp6kI]~fvn[+2bdP 9VenRJ j߲=ABe ^Xov_> yJFE$%dP^ѯz[4m7Yw[?u??wS؝{"P]ugrGj_ZA޳z+3Lo6ՃTt_YZfn1+dN cPi8pbw:L%qB/AW/$9;=[v6R>}=Y}'Vres=W"uШ;JL gZSh{ln;DIn?Gʝ3"w;t-HX~][dH ENe'bnpj?U^ncB@hG. \WML G9+4d JibɖU y}C T],YSX\]3I ~ 1<40yiپf\R?VUz=aGW,SO~>?@JQ:*J8Kw m4Lg螺<_~{Bp )Xd 1Hi:anp)p$1Z"aIk,ȸA;3.3wRԴ-i:43N[03Y-{_#@T &\.iݻ7va}ɯ<ꏷFk0U^}!w D_ PH@T`K[V=!%d FHnY80(p2NJi 28je w{n=IH>T妁G Qk'+iH;P7KohL7nyt~3<;MN68d4I34oCNZA(X%:v:@Ď4dR̴h}%%oܓVy 22Hktn+E+)약&fIFtI\w|QR*Q5YS._ֺOӦE?(XIL*>0zCOa+5_2 clfס|k =}.tj)DG -Zf8~1o@W~3EWnOy>7MR-賿=+B3)~Wjqmbx_.Ogd݂Avo+=Z2f/վ u=?AۿdP Pa"8j8QYմЃ9 j>)iЯ-),i[azA-01oxUݢ?ۦnz?ɕ?oUN O:Fz$B@ 4wuonoW^m6hsPGn1*QU)?1dA eP6!ۑk[JAHl(L"_e"!J3`:{CGWdFԽ*WwEk&!O L1A^ʝAbXHwP`⏡d: HjEH jɄO8Ml-ſ"mג:չ+F3U։$oW@$Yҿ!:_ӫ/!,G08yKrٚ"~vVc_'l_b+'U/$ٿvW׷dP Y]Hed nĿgW% Dzb)RJV5ck27MII0/V>)IddGy@3rXײ]P.nxbVŰS72JPt{ Ҋ "rM?cř;z=ؓW/FgrbCL-#'Bdj LJ`% n:u r)cKQ\诗]?CJC]9*G7(jQ^>_qaKK|":3_dAK!M/)F ߪGjۦ~o+PInR$OL>UK,׷V?~]s% vid aJArYhվuG-}+@2\DQ^)$=9m/աqC6 qdQ4|Cʚac2#]t>Mi-e3^ p^3=f|_:yӰ_1U"\/uͺ8s-TՔ0pdbqP,hj &(``v%>&?U4!L GN".E4RqM|M/Xcypnjo`.'Fhx$f4#DS O$1"t&wN:}޴]OYs5ا>6\1WT0Y.ΟBt !92)u3 |d N)nP&|h5]r5v5~?G**堐Ƴ%?^ ̭IHrqb[Ӗޚ=_sjȀ̀~Xy![)M9#>ٸJ:תD=֟*&kd) Ja%8npYֈ]xڞk=)j'QjW0Qdm84.,!<tV}Ñ h29 肛umH'ܗ=n^ zp08ox+GLrw2Llj_d; Ha8h΀ pTeT+~6jt'8Jg= h@d 8!l؋1.^9JDm 7g:_*_2*2rdQf$YHq2Y\PFX׮v 1ɀFj;P Go]kdG QHe8 2TM6gԚ#۪ 73h` YFbH m_B\%w1kEۯAwpw %⏃3}KHEl:ʛG-deC6ćv}{UD!tչ~~#J*swg%ǯbE`d_ 5Hi82 p4Q۰ZYb&ۗʚ0t_^}?BW[D /bAPXa0u `)9#,e5S\1Jf 5yFhZO=䒣"BgǺ!bK?)>ѹ)rQVds DicIZN!AMkrz%;֔*b@/)XU}9[,,2iPR+u1*k `ӽ8ż>^=Ks4.U,orIS{>OSjDLE -.(KКSsaVR{k_d F ieb !2pށ6vPp]*;`0 tB8>B͞_/0Os Vw. jק_4~eK謯#@A!Kƒ> yMY;qWo3_WSBUdV, 8i*4$+"KyƢ2 ~矻C짵]fsf&b, @8Y*f)xj˄B< Tů;lOY?FvEվU]?G譾o?#iԨ|}ؑH "0:d/PY}3?ڳam0R׷md Pa%8A~Xo_9>rJ!>#wMRੜ\|Oᓴ(֮̈́J]*͞m@ ox忹yo[Þ 3j .#o BRZEAGϧǃzNgkf~f}to/d ER&aXDt_߾baӋ$5J|w1*P < ЎҧF][:^km_ꩮR| P *(4 Iie]f>ֿ +pgk78p.GC<_n+ ^Ud Ta&V qız4v!ԅ>h3R*=[^WGZkDbj?_}7M;gsd ryN5eXk2:Vц =yԪ E*% t"9 *?%4d PabVQVzĐ!V-+wӟZ?MV;7ECG}#үodM^Ra48 QMg^4݀9-`wk5?GoW`-[K#T |r7&FL?\HXS,uXɝd T+l$(bZ*Tf (q"rʧx*͐rD6Ö'h \@rC4D m7T!^X8f{/4Y.S3q֝_BG97\ X175MI-ˈ*}UI+_[Rss7{&p`J x I2Ι;nna.9BfuA|r@' !@vQ.R'ijdR̴*Vhg<f .VMmo8JN:hQ RM<28~J0P gJLk\r' ? d 1yt`m+I[JZ2 K9i̛7u$뺵v=v3ݟmDdUWX0p`c[x/\~Ŕ@L_w~a,2r<F$贊զ/ep[|$Ŝr]4K )u>/I;DU eQ;4S}s.z-쾯@gY wYQ&ڪd? `Vh~Λl_O!Gwi"6Ita,ދ;PMGs#f} Qc2wm[%v-DS]g.x*7*=]2&d*JЬI3 XI>Aֆv=c!Z7*Qw?;DB mpdS hMTa4V I<@F.3M0ŕt TC)t/mZ1O6n o[ļFd~ LYu΄-1hZ߱D xX9C[i$)Gazji>tVD>]2{%"Rl(B{EBՊ[_Ywu$R.p rarQ[&sIdx Le8NXtI+91ޒmGFПW/x=D@CAe'aATr׃E%{ @.+Ns뉕:}fJ5=tS}$\.JuoeUL[d}*~>hze " H: K Dl@DPbQh4+{J@С~(kgmUDfYGU#D:vvN6i5A)5SȁlPc8cd yDa"LQ>xFlEj{ Z&TȒ{5QZ3i]},shoIB)+DP1j M'AjEG+ޫ hc6T5\~ݤ0 5(ɼmC9"+[@i: ұYuǔ\|$>;=/" ̂R;]EDd țDa,q.x D,],c) (P9L2*nGG zz:u[\]Y,qhpK"ԒT}V1:Q;Y@d~k`Nu4uzr>} .Lh5&3Z[?Mkq!f}TTg qh!ҩ;Lzl[K^fzHu0 2Rz$Asd}ߵۣ4n]#3h yD2r@4UߒGc)U)G5dUqd`Kd@e"lZpDա:"q)j.$A=8)c4WG9fe.Vׅ}%Wmnq g3 EBجw* 3ؙ`u{AmZ/ ݜ0|D寈g7AH(vM0Ø@ԜdmviCX 8*o+WI;BINr4.{J1ιTd hB`da6l*}G˨Ml;= p!EǜZOVTV*Ʌ ,2M~LS[*`bOGUBuڌ40?Q=A, :8^i[H$2y?3+/:ZL5"1..D} @ FxX0gBW~x<E$zG_8 ib2[Sdw3?#W4Ī7{OGi:YcWO#3LԳMcjU ,X(d *DUJݠbv!3D8VjP{3b(BVi\Ko^d ܷ^nyḥ*fLh*K+LOv̕ pn%}f҄|UMVHzuSo@b\R@(? XcM N2N/gd Na*8NlO*A 0R(:$:3G*ӑ:I;Zc]d7Ci?W{YOGӭe|Ս6ˤ:vrP6å!_%ۋ>`d N`2n ܦYI$}cmbG)3Y 0tj?itD*RC4=G*/\m1ڋ%#2y_лr~y4wq=ݍ3MZS汿`"[-(ZR.D7@C0m??ӳS or0Vd JnXP囝77^4hfo;C B8k+S߻$O}1Lھ^1_LPaCsrQ3vxu:ݼ.noNLV!T.bpD"xyVuCz Σ4?c$LʵҏatdVǼdP&TEMz0b iTG}wG05J:gM.;{{WST1O1OS9]HIu U#Y.:|䴇A671^dB@Z΃^g=j4[z#!}ʈ[n}2dJ o? 5fVO.sRD QQ eRO _?u%!Ah~BHT`E[k+RN[e8AN :roJC:=L[S[vs_(^l\NCd^V.= \B .skd˫2d.E+r n^ؗ?=:4*N8 K@$rC[%(eQCo&2+%ۖT}Qo_̜m >PD` e/"" zBC{k /b2q3$!jZކk}* oE#er_} BrnQ8CP|9y2An_Y}" mH]WI_ э}򋠼c{pPdIVPi%_n$|cTjeVI|j|gRL_d6$ݫh2ǰ nhF&|nh$BZ0ΖOo&ITMے~sؚ/=sUGAaT2rtCp&j*߼qoD& ZP%`4 P N]Rs&Uvo֯8?7oM7,Y t9N¢̘UUC&S(]=# zPsri/ʽ=頳zqIWFW؟?Vx*cKЧX @A2 Md *P h^;n4 >ēogףVk.87Pʩ-#k&Lվ`V'O4s]4{uyz?}j  @BB,؞-IHX""(,NbBGGDd) VLc?qⅇ!Bj.^`CɨaGH3Ӡ`W:Amoa蟧bo;EEB%$Ɇj1 . 8=W4[_Fyy I3dHYl]Nd= eR/de4j Gwۉ DwB5&̾ҷbmKȗB4S}~l/`J_I _L1RB~ AmByGmQ;w>`djN(qLNb?S9ߠ%dQ J h8nєdBUID =QXF i伬(p_lf6+߲2/3m>$Z*XAKc'C ~W{~D8[}H_A%=ie0PhѲ>"ug" H 0#A` Ydg |M0 %<~d xLe%8jt_V]֭С= l2 *P"^&aMd 6y9/>^,BADiNuu?-T|C#suJE(!<) (+ ]V8A3h>D%ͤcq\_d L h>jJtR@Ɏ/8 ڑhwt(\(m'.̺ܧ= Q򦥋u 'G[EKeE5˼yZgEe OZcwUZ:$qDRzt{ᆲr(냙dEA{xp#_oW;jB7I (Rjd |Ji':Y DphVXX"qo'k q 2޴>AR{@5NعUE~i~-+DAޖ|.Ë4 /3*uܔvC,I4Oo Wa<550΍2(9QoAd pFm89jNvm!붔;֑جV~?PiW^ OK2; RNLtR F@1vMܢdN=}O7VB?8)s)1DY *lF2\ars3 dF _;dx{ UUtd Hi>qjNxX:f8N<ؕ9r+}fh.31D=4Y,& HP0T!PZ8w=kچKiTꌤ-tvyA]ͳ_#JJ\@Tg)Z|R+ )iC(`\rq~゚$8c`d !FhZn|Jxd>0f2s]w5ۯ]]V d'`p;J.Y(glm;<fǟ\Pd Dme>xJv E{$??_ZzطL!ޕX̡!i-Cl .FWS!qX8H7&vvnĝ?tPO*Lq íO4OFF!.r%}5nx pBՓȞ~MvoTz wfvwjm00D-i^ {_1R):uʤx\-93a0:lml 5Ji*߻{v{g*Vy]ioԮPbT<: OULڡ(ȨedJd B :p\@mRC{agEl}S"L-jguo*9J}TT$}V;t_}TLjxhMa|;ָʹ;MSrQӅ,0P$K66F*֪8ҩ3Ĉ:@ܐr8P%y'r$AdJ̬ 8CSWR\t6noB|=Y{ٿs/ȟ<" b7}}3S pДCv4τ`칧J  y fYM-l1'NT}}w7{ =YzZhR_dV ]P P7Wb@&.e1 DíW8Al80htiOdT iDe%!8ޕ[13.wc !,B"l6HtN yS>;xPoS:.- xee0'lx?UR`?,2.%*+Sz߾:uD͕k%=D[JDan6?O>r#1W|*L guHS}5EzXF9}bDcYh+hpR]SΗ_0ή`v=1- O='`9wj)·A "[o_ds Va8:{ l7}O;FED(A oO??˪ `N۵&͋~Ϲ}_fQQ\ߛc 9? O? Oۃ U2[[)Z;ˑw NLeD XkeB|¤J/'G+ol;%U =TIBeUoV8ۙD'da?a ;G:zݿUUSy"xTU!"˸Wr`E\"FH͛^d Tdz*@ B6_Srq+d0(Aj(>5HڙU"Jj?X~8ݺjٹ箦$xG~ 3"iHsǺ=ZU4?!oK_MVZTd T4!EXh&W* V3-R@Ug_'8\i5qZ[hN'+A\|?>|UQJ  QaH_QcBቺk^bK Rfx(|n80 `~2dR̴"@a9,"G<: "M A ,䬼`zIg2!|ǵaXyEY$+sEH$ ,2uZo*TOɛ1j˯.ֿ'{.oZt) xmA&Eͫ_h:駮j;]d \ j8Fivoxh2;*,,A4B0[nweL>*-.UZT _u/,kϿw$`* b.:\wJn!'3}w)Jvj3ad4 XVe8 "u|דyYm窫U[/2Ȫ!%a̷< j cf\SwEjK9^ K'2oV{|y5d Scl٦+KuKvz&s>g@֯/CMoR[ Um*KUf&dH 4Revrj#^zu!qV `Q'=CH:Ǵ=hoΛyHOߐG9R3`K20 pϱ' M!rg쨄{vTo~E=Lei--Vj{6^v[eKuAnk+da P i'h 1rZhZdA)r7Fn3U*B Jνco#U3%A& d8C ʇڽf@I c0̸>7SAvZFރ2UtĝnʽNwmߎe\(Ly&%5j2z([l;|dx Niet rl)W9~jdگoеս|B1][XqGCQM-X\,0\΍(Tx9H*}{Sq!ub$P@Pm$/: 1O]aʖy$R#WqP~sjd qNepqnTj y/DM0+jH/NN~^mT)9eKcͮRTҐٚ3gWCG_c(H&(vzً4:f:^@tʇ\ϙ}@|̉ePҽ}_}o65@I:}d cPa9npcV IxiF{yhIrZzoStS2`bz}Kc/̕a7^P7g5wY(2FNX'h@dFno`"mDo+wa O$h!]|d Ni8yJAK^Fjvi-tݒSN1PTgƪ=k9ԛހ?ȶ3K<6t)=[(ט&vDE?5 ؍bԢQ0&?/uOyV VpU4cݙ\uʘ5griUu>doPe8QnrKRu_)ܐʱʟj0 fzN&s[=0{qLd|7iPG1k,n+P*{[eK/ Ԕ@+co17]6mU`UON$j!_K׿!*QdE~ĭd Le8QrTOQwV`C Z2Qb"tKqz^'\O1"sX |m:wLPi#zxԷ[z??EiZCT5bBq9-Tի(N;ڰ .@J Tx~CvJD GWΧd Jed|JыXPl)YO /׫ӶKfAi$u5 %"xs9-i1|%9|x%& m)Jpժ eysuB(E-qf"iCPo`Rب {`d He:YxN ieC/=qY+V\d"r{??Ow)/OXHxA`[ˣ.1(Io[H2Yubq8k CTU35MA7Tsc*}K-J0d Fefx삖 ā MHAS%qv4"*zeRԧ?+}@qFY?M1僚=Nҳ) dM*W|5*eQdke6@Hx++0Lgu5L櫨Oeg:wH=f\jsLǪT}=d Fef!jNĔW{tyeiOIyQsb[BrI{>*THJx"IB0$%̕_sRJ>PM3¡U7E=df {ȍUVN o_nJ;VRe8Lh' Zh/&d $He'vț2cuLjJRGftE͹;s,x~̗?Q"<tfqF4&*' ad`D-|KIcKR4;Q\D_$[(79 l ѭ('Xi~ݜ1³"k&E]td FegtTԃǔ R֒Stm-U3R=KvhM5Wo{WV;t{=z"ss|ʺm[?\m?@`p$@AR^a  AIvWI$%8^3yi5#oo15ʦREK8_?VQIS} M9G+ !!kFSYa8 )E[&.y:Fϝ% " frBC¡bQQp,sd6L ,)vxdLl&/bBmv_Xq][{3LkAIqw֥ g-A%*E!ס%/"9}9S}aPsV@ymY;v?{Գ~[}~Gn6DDpd] 5LnX&FP0paWe֖v΋Gq[QQ&:)?o.%SW؉>'=~i&4>2ʌL YnrAИgaV?-_E}hW?^G Nd\ Ja8nօc((lkMp)ǒ4gmWU?:┫o9g?tCjk+hdwU%"vU?.K;مIO>wz0V0Mh t _rϩJ?}_  Z4]db oJ)nY8ң=Ξ__HH><OLّț-(T__@!Y{@峰bd .LI֞ u 1 üqY";PZȺETv!=ޒ֤>JMjO*E)nDquD̴!΄ hI'쓠ƫ6_uQi"tkXh YOk5PS / z*Xcsd%2Pj^Ybֳd T`Ke1UsD.jzOJgڧH6_Tҧ:i/ugRS5LAME3.96UUUUUUUUU uPaypalURLChttps%3A%2F%2Fwww.paypal.com%2Fcgi-bin%2Fwebscr%3Fcmd%3D_xclick%26business%3Deric%252echatonet%2540sosmartsoftware%252ecom%26item_name%3DEric%2520Chatonet%26item_number%3DDev%2520Support%26no_shipping%3D0%26no_note%3D1%26tax%3D0%26currency_code%3DEUR%26return%3Dhttp%3A%2F%2Fwww.sosmartsoftware.com%2F%26charset%3DUTF%252d8*Monitoring a Player Object to Play Music  ULucida Grande UGeorgiaUGeorgia ULucida Grande WLucida Grande WVerdana UVerdana @UVerdana ULucida Grande UCourier @ULucida Grande @WLucida Grande WLucida Grande AULucida GrandecREVGeometryCachestackID1107 cREVGeneral scriptChecksum`0jsISO debugObjects breakPoints handlerListkeyDown returnKey commandKeyDown arrowkey CheckForQT QuickTimeLongVersion CreateSoundFileFromCustomProp TempMusicFolderPath MyRoundscriptSelectionchar 359 to 358 bookmarks prevHandlerarrowkey tempScriptscript=

## Player stack

## By Eric Chatonet

## 7/13/05

## http://www.sosmartsoftware.com/

-----------------------------

## This handler traps when the user presses the space bar:

on keyDown pKey

if charToNum(pKey) = 32 and the enabled of grp "PlayGroup" then -- ASCII code for space

send "mouseUp" to btn "PlayPause"

else pass keyDown

end keyDown

-----------------------------

## This handler traps when the user presses the return key:

on returnKey

set the currentTime of player (the uPlayer of grp "PlayGroup") to 0

set the thumbPos of sb "MusicProgress" to 0

end returnKey

-----------------------------

## This handler sets a short cut for looping

on commandKeyDown pKey

if charToNum(pKey) = 108 then -- ASCII code for l

set the hilite of btn "Loop" to not the hilite of btn "Loop"

else pass commandKeyDown

end commandKeyDown

-----------------------------

## This handler sets the player loudness with arrow keys

on arrowkey pKey

local tCurPlayLoudness

-----

put the playLoudness of player (the uPlayer of grp "PlayGroup") into tCurPlayLoudness

switch pKey

case "left"

if tCurPlayLoudness = 0 then exit arrowkey

subtract 10 from tCurPlayLoudness

break

case "right"

if tCurPlayLoudness = 100 then exit arrowkey

add 10 to tCurPlayLoudness

break

case "up"

if tCurPlayLoudness = 100 then exit arrowkey

put 100 into tCurPlayLoudness

break

case "down"

if tCurPlayLoudness = 0 then exit arrowkey

put 0 into tCurPlayLoudness

end switch

-----

put MyRound(tCurPlayLoudness) into tCurPlayLoudness -- 

-- see MyRound function below

set the playLoudness of player (the uPlayer of grp "PlayGroup") to tCurPlayLoudness

set the thumbPos of sb "Loudness" to tCurPlayLoudness

end arrowkey

-----------------------------

## this handler checks if QT is intalled and if the version is sufficient to play mp3 files according to the current platform:

on CheckForQT

local tStatus

put QuickTimeLongVersion() into tStatus -- 

-- see this function below

switch

case not line 1 of tStatus -- i.e. false

put "QuickTime is not installed." into tPrompt

break

default

switch

case line 3 of tStatus = empty

put "QuickTime" && line 2 of tStatus && "is installed." & cr & cr & "This version allows to play mp3 files." into tPrompt

break

default

put "QuickTime is installed." & cr & cr & "Your QT version:" && line 2 of tStatus & cr \

& "In order to play mp3 files, you should upgrade at least to" && line 3 of tStatus & "." into tPrompt

end switch

end switch

answer info tPrompt as sheet

end CheckForQT

------------------------------

function QuickTimeLongVersion

local tLongQTVersion,tShortQTVersion,tShortRequiredVersion,tLongRequiredVersion

-----

set the itemDel to "."

put QTVersion() into tLongQTVersion

put item 1 to 2 of tLongQTVersion into tShortQTVersion

-----

-- fixing the minimum required version according to platforms to play mp3:

switch the platform

case "MacOS"

if word 1 of the systemVersion >= 10 then

put 6.4 into tShortRequiredVersion

put "6.4.0" into tLongRequiredVersion

else

put 6.0 into tShortRequiredVersion

put "6.0.3" into tLongRequiredVersion

end if

break

case "Win32"

put 6.4 into tShortRequiredVersion

put "6.4.0" into tLongRequiredVersion

break

default

answer info "QuickTime is not available on Linux." titled "Error"

exit QuickTimeLongVersion

end switch

-----

-- testing results:

switch

case tShortQTVersion = "0.0"

return false

break

case tShortQTVersion < tShortRequiredVersion

return true & cr & tLongQTVersion & cr & tLongRequiredVersion

break

default

return true & cr & tLongQTVersion

end switch

end QuickTimeLongVersion

-----------------------------

## creating a temp folder and creating a mp3 file in it from data stored in a custom property:

on CreateSoundFileFromCustomProp pMusicData

local tTempFolderPath,tFileType

-----

-- creating a temp folder in Rev main folder:

put TempMusicFolderPath() into tTempFolderPath -- 

-- see this function below

if there is no folder tTempFolderPath then create folder tTempFolderPath

-----

-- if the file is not created yet, we create it:

put tTempFolderPath & slash & "Music Test.mp3" into lMusicFilePath

if there is no file lMusicFilePath then

if the platform = "MacOS" then

put the fileType into tFileType

set the fileType to "TVODMp3 "

end if

put pMusicData into url("binfile:" & lMusicFilePath)

-- note that using a binfile is here compulsory

if the platform = "MacOS" then set the fileType to tFileType

end if

end CreateSoundFileFromCustomProp

-----------------------------

function TempMusicFolderPath

local tTempFolderPath

-----

put the stacks into tTempFolderPath

filter tTempFolderPath with "*revmenubar.rev"

if tTempFolderPath = empty then

answer error "Could not find the right path to initialise some stuff." with "Sorry"

exit to top

else

set the itemDel to slash

put "temp_Music Folder" into item -3 to -1 of tTempFolderPath

return tTempFolderPath

end if

end TempMusicFolderPath

-----------------------------------

-- this function is used due to a bug: you have to set the pageInc to 9 to get the ticks displayed correctly with OS X on the loudness scrollbar

-- and we want the playLoudness to be a multiple of 10. So we make a correction:

-- note there are no ticks visible with Windows

function MyRound pNumber

switch

case char -1 of pNumber = 0

return pNumber

case char -1 of pNumber < 5

put 0 into char -1 of pNumber

break

default

add 1 to char 1 of pNumber

put 0 into char -1 of pNumber

end switch

return pNumber

end MyRound

 PC ## Note that all handlers and functions in this script are private ones ## Use the option menu to check features in the right scripts ## But there are some interesting features below :-) local lMusicFilePath ----------------------------- on preOpenStack set the style of this stack to modeless set the loc of this stack to the screenLoc end preOpenStack ----------------------------- on preOpenCard if line 1 of QuickTimeLongVersion() then CreateSoundFileFromCustomProp the uMusicTest of this stack -- S else disable btn "ChooseFile" -- see QuickTimeLongVersion function and CreateSoundFileFromCustomProp handler in the stack script end preOpenCard ----------------------------- on openCard InitializePlayer (the uPlayer of grp "PlayGroup"),lMusicFilePath,"MusicProgress" -- ShowInfo (the uPlayer of grp "PlayGroup"),lMusicFilePath,"SoundInfo" -- -- see these handlers below end openCard ----------------------------- on closeCard local tTempFolderPath ----- -- cleanup put TempMusicFolderPath() into tTempFolderPath -- -- see this function below if there is a folder tTempFolderPath then revDeleteFolder tTempFolderPath end closeCard ----------------------------- ## returns the total duration of the file in hours, minutes and seconds: function DurationTime pPlayerName if the timeScale of player pPlayerName = 0 then return empty -- means that the file is not supported by QT return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName)) -- C -- see ConvertTime function in card script end DurationTime ----------------------------- ## Returns elapsed time since the beginning function ElapsedTime pPlayerName if the timeScale of player pPlayerName = 0 then return empty -- means that the file is not supported by QT return ConvertTime(round(the currenttime of player pPlayerName/the timeScale of player pPlayerName)) -- -- see ConvertTime function below end ElapsedTime ----------------------------- ## Returns remaining time until the end function RemainingTime pPlayerName if the timeScale of player pPlayerName = 0 then return "Non available" -- means that the file is not supported by QT return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName) - round(the currenttime of player pPlayerName/the timeScale of player pPlayerName)) -- see ConvertTime function below end RemainingTime ----------------------------- ## Converts seconds to hours, minutes and seconds function ConvertTime pSeconds local tSeconds,tHours,tMinutes ----- put pSeconds div 3600 into tHours put pSeconds mod 3600 into pSeconds put pSeconds div 60 into tMinutes put pSeconds mod 60 into tSeconds ----- if tSeconds < 10 then put 0 before tSeconds if tMinutes < 10 then put 0 before tMinutes ----- if tHours <> 0 then return tHours & colon & tMinutes & colon & tSeconds else return tMinutes & colon & tSeconds end ConvertTime ----------------------------- on InitializePlayer pPlayerName,pFileName,pScrollBarName set the fileName of player pPlayerName to pFileName set the thumbPos of scrollBar pScrollBarName to 0 set the endValue of scrollBar pScrollBarName to the duration of player pPlayerName set the thumbPos of scrollBar pScrollBarName to the currentTime of player pPlayerName put ElapsedTime(pPlayerName) into fld "ElapsedTime" -- put RemainingTime(pPlayerName) into fld "RemainingTime" -- -- see ElapsedTime and RemainingTime functions in this script end InitializePlayer ----------------------------- ## creating a temp folder and creating a mp3 file in it from data stored in a custom property: on CreateSoundFileFromCustomProp pMusicData local tTempFolderPath,tFileType ----- -- creating a temp folder in Rev main folder: put TempMusicFolderPath() into tTempFolderPath -- -- see this function below if there is no folder tTempFolderPath then create folder tTempFolderPath ----- -- if the file is not created yet, we create it: put tTempFolderPath & slash & "Music Test.mp3" into lMusicFilePath if there is no file lMusicFilePath then if the platform = "MacOS" then put the fileType into tFileType set the fileType to "TVODMp3 " end if put pMusicData into url("binfile:" & lMusicFilePath) -- note that using a binfile is here compulsory if the platform = "MacOS" then set the fileType to tFileType end if end CreateSoundFileFromCustomProp ----------------------------- function TempMusicFolderPath local tTempFolderPath ----- put the stacks into tTempFolderPath filter tTempFolderPath with "*revmenubar.rev" if tTempFolderPath = empty then answer error "Could not find the right path to initialise some stuff." with "Sorry" exit to top else set the itemDel to slash put "temp_Music Folder" into item -3 to -1 of tTempFolderPath return tTempFolderPath end if end TempMusicFolderPath ----------------------------- on ShowInfo pPlayerName,pFileName,pFieldName set the itemDel to slash if the number of items of pFileName > 4 then put "..." & item -4 to -1 of pFileName into pFileName -- then we truncate the path if the timeScale of player pPlayerName = 0 then -- the file format has not been recognised by QT put "Unsupported Format" & cr & "Duration: non available" into fld pFieldName DisableAllCommands -- -- see this handler below else put pFileName & cr & "Duration:" && DurationTime(pPlayerName) into fld pFieldName -- -- see this function below EnableCommands -- -- see this handler below end if end ShowInfo ----------------------------- on DisableAllCommands put empty into fld "ElapsedTime" put empty into fld "RemainingTime" set the icon of btn "Backward" to the ID of img "BackwardDisabled.png" set the icon of btn "PlayPause" to the ID of img "PlayDisabled.png" set the icon of btn "Forward" to the ID of img "ForwardDisabled.png" set the enabled of grp "PlayGroup" to false end DisableAllCommands ----------------------------- on EnableCommands set the icon of btn "PlayPause" to the ID of img "PlayNormal.png" set the icon of btn "BackWard" to the ID of img "BackWardDisabled.png" set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png" set the enabled of grp "PlayGroup" to true end EnableCommands ----------------------------- on CleanStack lock screen enable btn "ChooseFile" set the menuHistory of btn "Tabs" to 1 set the lockText of fld "Discussion" to true put empty into fld "ElapsedTime" put empty into fld "RemainingTime" put empty into fld "SoundInfo" set the thumbPos of scrollBar "MusicProgress" to 0 set the thumbPos of scrollBar "Loudness" to 80 set the hilite of btn "Loop" to false set the fileName of player (the uPlayer of grp "PlayGroup") to empty DisableAllCommands -- set the menuHistory of btn "ScriptChoice" to 1 unlock screen save this stack put "Done" end CleanStack XcREVGeometryCacheIDs'11216710964401102112092045029210261121506737255110821118333234592101511217805042191049112150673774511085112092042454710241121507922073108011216696427121097112151635006910991121517069080103211209185537891017112178459377111081112092044433010221121506737925110881121670777155100811215067376841108411214356325131058112997514290432581121435601430105711215072367571092112150723675910931121240529384105011215067383491109111183273217871004112150673731211083112150673786211087111832737393310061120971869846160011183289376851012112150673821211089112150673828411090112092058566510271120920379612102111215067378031108611210711934781047112150723678410941121672125478110111217809244711030cREVGeometrycacheorder1121517069080 1121071193478 total39 cREVGeneralscriptChecksum>N'3U bookmarks breakPoints handlerListpreOpenStack preOpenCard openCard closeCard DurationTime ElapsedTime RemainingTime ConvertTime InitializePlayer CreateSoundFileFromCustomProp TempMusicFolderPath ShowInfo DisableAllCommands EnableCommands CleanStack tempScript prevHandlerMyRoundscriptSelectionchar 2968 to 2967scriptF/

## Note that all handlers and functions in this script are private ones

## Use the option menu to check features in the right scripts

## But there are some interesting features below :-)

local lMusicFilePath

-----------------------------

on preOpenStack

set the style of this stack to modeless

set the loc of this stack to the screenLoc

end preOpenStack

-----------------------------

on preOpenCard

if line 1 of QuickTimeLongVersion() then CreateSoundFileFromCustomProp the uMusicTest of this stack -- S

else disable btn "ChooseFile"

-- see QuickTimeLongVersion function and CreateSoundFileFromCustomProp handler in the stack script

end preOpenCard

-----------------------------

on openCard

InitializePlayer (the uPlayer of grp "PlayGroup"),lMusicFilePath,"MusicProgress" -- 

ShowInfo (the uPlayer of grp "PlayGroup"),lMusicFilePath,"SoundInfo" -- 

-- see these handlers below

end openCard

-----------------------------

on closeCard

local tTempFolderPath

-----

-- cleanup

put TempMusicFolderPath() into tTempFolderPath -- 

-- see this function below

if there is a folder tTempFolderPath then revDeleteFolder tTempFolderPath

end closeCard

-----------------------------

## returns the total duration of the file in hours, minutes and seconds:

function DurationTime pPlayerName

if the timeScale of player pPlayerName = 0 then return empty

-- means that the file is not supported by QT

return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName)) -- C

-- see ConvertTime function in card script

end DurationTime

-----------------------------

## Returns elapsed time since the beginning

function ElapsedTime pPlayerName

if the timeScale of player pPlayerName = 0 then return empty

-- means that the file is not supported by QT

return ConvertTime(round(the currenttime of player pPlayerName/the timeScale of player pPlayerName)) -- 

-- see ConvertTime function below

end ElapsedTime

-----------------------------

## Returns remaining time until the end

function RemainingTime pPlayerName

if the timeScale of player pPlayerName = 0 then return "Non available"

-- means that the file is not supported by QT

return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName) - round(the currenttime of player pPlayerName/the timeScale of player pPlayerName))

-- see ConvertTime function below

end RemainingTime

-----------------------------

## Converts seconds to hours, minutes and seconds

function ConvertTime pSeconds

local tSeconds,tHours,tMinutes

-----

put pSeconds div 3600 into tHours

put pSeconds mod 3600 into pSeconds

put pSeconds div 60 into tMinutes

put pSeconds mod 60 into tSeconds

-----

if tSeconds < 10 then put 0 before tSeconds

if tMinutes < 10 then put 0 before tMinutes

-----

if tHours <> 0 then return tHours & colon & tMinutes & colon & tSeconds

else return tMinutes & colon & tSeconds

end ConvertTime

-----------------------------

on InitializePlayer pPlayerName,pFileName,pScrollBarName

set the fileName of player pPlayerName to pFileName

set the thumbPos of scrollBar pScrollBarName to 0

set the endValue of scrollBar pScrollBarName to the duration of player pPlayerName

set the thumbPos of scrollBar pScrollBarName to the currentTime of player pPlayerName

put ElapsedTime(pPlayerName) into fld "ElapsedTime" -- 

put RemainingTime(pPlayerName) into fld "RemainingTime" -- 

-- see ElapsedTime and RemainingTime functions in this script

end InitializePlayer

-----------------------------

## creating a temp folder and creating a mp3 file in it from data stored in a custom property:

on CreateSoundFileFromCustomProp pMusicData

local tTempFolderPath,tFileType

-----

-- creating a temp folder in Rev main folder:

put TempMusicFolderPath() into tTempFolderPath -- 

-- see this function below

if there is no folder tTempFolderPath then create folder tTempFolderPath

-----

-- if the file is not created yet, we create it:

put tTempFolderPath & slash & "Music Test.mp3" into lMusicFilePath

if there is no file lMusicFilePath then

if the platform = "MacOS" then

put the fileType into tFileType

set the fileType to "TVODMp3 "

end if

put pMusicData into url("binfile:" & lMusicFilePath)

-- note that using a binfile is here compulsory

if the platform = "MacOS" then set the fileType to tFileType

end if

end CreateSoundFileFromCustomProp

-----------------------------

function TempMusicFolderPath

local tTempFolderPath

-----

put the stacks into tTempFolderPath

filter tTempFolderPath with "*revmenubar.rev"

if tTempFolderPath = empty then

answer error "Could not find the right path to initialise some stuff." with "Sorry"

exit to top

else

set the itemDel to slash

put "temp_Music Folder" into item -3 to -1 of tTempFolderPath

return tTempFolderPath

end if

end TempMusicFolderPath

-----------------------------

on ShowInfo pPlayerName,pFileName,pFieldName

set the itemDel to slash

if the number of items of pFileName > 4 then put "..." & item -4 to -1 of pFileName into pFileName

-- then we truncate the path

if the timeScale of player pPlayerName = 0 then -- the file format has not been recognised by QT

put "Unsupported Format" & cr & "Duration: non available" into fld pFieldName

DisableAllCommands -- 

-- see this handler below

else

put pFileName & cr & "Duration:" && DurationTime(pPlayerName) into fld pFieldName -- 

-- see this function below

EnableCommands -- 

-- see this handler below

end if

end ShowInfo

-----------------------------

on DisableAllCommands

put empty into fld "ElapsedTime"

put empty into fld "RemainingTime"

set the icon of btn "Backward" to the ID of img "BackwardDisabled.png"

set the icon of btn "PlayPause" to the ID of img "PlayDisabled.png"

set the icon of btn "Forward" to the ID of img "ForwardDisabled.png"

set the enabled of grp "PlayGroup" to false

end DisableAllCommands

-----------------------------

on EnableCommands

set the icon of btn "PlayPause" to the ID of img "PlayNormal.png"

set the icon of btn "BackWard" to the ID of img "BackWardDisabled.png"

set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png"

set the enabled of grp "PlayGroup" to true

end EnableCommands

-----------------------------

on CleanStack

lock screen

enable btn "ChooseFile"

set the menuHistory of btn "Tabs" to 1

set the lockText of fld "Discussion" to true

put empty into fld "ElapsedTime"

put empty into fld "RemainingTime"

put empty into fld "SoundInfo"

set the thumbPos of scrollBar "MusicProgress" to 0

set the thumbPos of scrollBar "Loudness" to 80

set the hilite of btn "Loop" to false

set the fileName of player (the uPlayer of grp "PlayGroup") to empty

DisableAllCommands -- 

set the menuHistory of btn "ScriptChoice" to 1

unlock screen

save this stack

put "Done"

end CleanStack

@ SSS.png  Hon mouseDown revGoUrl "http://www.sosmartsoftware.com" end mouseDown 0"-PNG  IHDR". pHYs.#.#x?v 9iCCPPhotoshop ICC profilexڝwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yzgAMA|Q cHRMz%u0`:o_F"IDATxbax& O?"?z$<@,X< dz,,2{H?Hk4^B˧̌<4i_rD@,hgaӊb:޾zo]ǷDr8 4y6{5ݕ]WMż#٩ƧoZQqm8$Iyon0w 3+ `8 K d+ ,?ۏҟ]xۥW/~g33+?@S_B9.3_823J{;kc :e'HfCqΈ#{x#Sxs`]Ϛ[^>Y5c+?8r2,FF zh(~(M Ѱ狻v%?d|\>}aeE,^%oΦU{ǃ_Tdگ?w>ytfo <"JYղC"%.686lq-dG &pK\j{H@FeoFWwnAςDE|Փg{Y8~#%̅~f^U8]#50Ln>n^>~f[v6&߰ d cvF>H?~ߟ郹,",Z9}WX%ëXDHĄŠ 9J02qrrﳃ_+yop6E[?;3R.QYy844>?ǛGW50s[s|DYޜs%fq-9_KLu~W=\j^n+!a&lgǯ^ӏ]m rB#ǻ? hV.n6%Lz<х ;'￿ ?g{3蟿~/,r6 ~rOmsy9<9'x9 s-RXxծ|:,>̲ܿ?R= w3< 0 C_>;%'o3_?*imcރ?"2BqN.z6UI/"N~|zʲ/Ho_8AII[9Ԟ|d/O^0Q-$*ۻ= ?:Ű̢*'c*fy_ο> ^Q0si.c``_̒NL l [{p H),x]^ F o1ٍ-w}R0XxkqF_bh6^ . f6F Y. M;S.!IΞz+ *rO3߿z:;;El9%5<{{ˣa!0F6q!qNq M ߿,Oمye-d~82ċsɫ }?R\]WɫJEYDMI\XBV^]$L\ҺJj\6_d x }#ǩB__=r{ 73昳ps0+hڙ7}T~˻oya!!#v</^#.+YXUGN?FSHERTYQHXVDWߞ\RP&-<*e|o:ԹDZO\C7VUAqc㗶ɔ2SRS^!ѕ򊼡r2\vont@W޳2.>eͩ\Pvw׾zY-NݛoM7+Iq+Z( V2{sW/~PvKꙟ(wnZ_V!_xDľTbƯ@I]u &vnn:aAJJ}0-{aQf_>\~A>/x a|x]=҆'?X=ۜ\VqIe̩>[g$\be4 KkabEXOH9 ϟqɍO^-V`ʇ{<~y1I 2sps2 }g,,j2 UWUgWĿ630~}go |mĦ#".$"oϸd⃥>_v>AFN~A&HFLOhpIY PW&У O7., ٲ;|e  ,(|w(㷕 ~ մ6岛6mcC  ŋ"Ogw^z`)PK(B ]SLhُn gyf quc|xw铦-Wfh9Ӌn?zzȅ<U6t5J{ʜ&'O;/?_SģNZƯƐ1D#Ey8rD9*{2hl8zi{᧖UqP$(M[QWc 'Ӆn@ȏ>ov7V9:V Ɇ12 QWB`"EkyщYeWާӝwZ\i+7M4+' 6 7J7tAcV3! abF$Lup!5ӭ4ՠn es=>zZ$g?./}<9YS8RGJRpVܩ-M/)=PXT<_1CWMr!lqy[KIE 1A fzY-3W‘W]d7ۑRVͿ h(Tb 69|yfʖ V&%a&'Jt^c N@JXJԎ0yof6>0S'_!à-c0_cFˮ ¶ 2.5 XjS%-X%ԑ0ꀣÝz]m?^8%g*@̶2)x+[V,$p59'>qdI@%˟x/Ⱥ)e9RJ)sRCbN+$ %\w7[:·mwhMNl'bIг܂:m֐kuF]i.w/_ߞo]e3 p ؂_.b,&kWLZSϯ_nlvӓ~K@LTKT]PRV }xuc&G%+v6FQIUVPqyV<<>~z';;0v..Vf&fv6VfV`A痏RQJEME&X@w2(9XW.wLrjɲ&(A[հxUe||RZ*)b< D.N`Q+,'ۤ ԳQxɗ<~}i]`b'lg54`g|}ƉOOE.FB XKl ɻuVGDTT`}yBXvRbgW1P燔vx4v  _vM{Dun` `C73\&vU+_R^;LJן_]>[DLk~5+RigvYJQˏ[̎ZN32;?߿???ٝ;?>|sbҒڞR?>~x!*h/|&xwoJDX̎[cƒ+_ X'*fZ+k”WCּs Ý _=l>$ٹ#WTOGOGp[`0W'=?Ǡw\"zi+'Z{7Μ r7/_ZAˋfeTxoW@Ps&on?MM(WT ֥y E 6!ßon7?ҿ?>zr[ Ƿ7?y򆘦<^\۽bꅅ Wuov>ZBݩ>SV'_]:2@W_?6Zd~|t󯰲S_:w5w~O_7;GL7H^츹kfamo>xtv!޳+O=`F`]7^\9xɉ-o8ee~¯oo iWԿ=4!MU3A~1?@KOa}`~H/7737?>o(2A_?{u'>7 `==Wpi}dϧ'v.Ⱦ2Y^<ӇXyy~~{'6~u+h ë >q^!eV w2{*wξ ?pf/+po?>+a%,-G!xs{ UziN:Lȉj?bFbFZ`X!C_5 lfUHv#H{ y*ϊa-Xc \|(:mJ[}pwwK\ӻ^7#`@jE f{&0HaOeR^b:"8r G#Rτ%P>-Z[XhWCC VAGL[X _DGY36ؘs`AX@z?6e_4B+LI=88hY X"=G1"978H3X˄ ۦ { nfh !l8t~C)yyޞoՙoo-Hu,k-Te5ʈfFK\{Hpehu?" GDÆGZK'h?D⡕B>,,7ug'H= `ı} /Q@60,lk1'!l"F?M!H \2nha?h"?͈+#Ă'?[BX?Z'$V} e@)ii@:TZVJ@, \͌o'zM[{@D}3<bhT``4Ӥ(IENDB` cREVGeneralscriptChecksum`}^.e revUniqueID 1118333234592 bookmarks handlerList mouseDown tempScript prevHandlerscriptSelection char 13 to 12script

on mouseDown

revGoUrl "http://www.sosmartsoftware.com"

end mouseDown

Tabs}zon menuPick pNew,pOld hide grp pOld show grp pNew unlock screen with visual effect dissolve very fast end menuPick Action Discussion cREVGeneralscriptChecksum0JӴU{hs!n revUniqueID 1120918553789 bookmarks handlerListmenuPick tempScript prevHandlermenuPickscriptSelection char 55 to 54script

on menuPick pNew,pOld

hide grp pOld

show grp pNew

unlock screen with visual effect dissolve very fast

end menuPick

Action i(6 cREVGeneral bookmarks revUniqueID 1120920379612 handlerList prevHandler tempScriptscript  SoundInfo @,{$ cREVGeneral revUniqueID 1118327321787   ChooseFileepon mouseUp answer file "Choose a Sound File:" as sheet if it = empty then exit mouseUp ----- lock screen InitializePlayer the uPlayer of grp "PlayGroup",it,"MusicProgress" -- C ShowInfo the uPlayer of grp "PlayGroup",it,"SoundInfo" -- C -- see these handlers in card"s script -- note that we use parameters to get a more generic formulation -- valid for any player, any scrollbar or any information field unlock screen end mouseUp X Click here to load a sound fileChoose a Sound File... cREVGeneral scriptChecksumN*oX handlerListmouseUp breakPointsscriptSelection char 91 to 90 bookmarks revUniqueID 1118327373933 prevHandlermouseUp tempScriptscriptD

on mouseUp

answer file "Choose a Sound File:" as sheet

if it = empty then exit mouseUp

-----

lock screen

InitializePlayer the uPlayer of grp "PlayGroup",it,"MusicProgress" -- C

ShowInfo the uPlayer of grp "PlayGroup",it,"SoundInfo" -- C

-- see these handlers in card"s script

-- note that we use parameters to get a more generic formulation

-- valid for any player, any scrollbar or any information field

unlock screen

end mouseUp

LoudnessLabel@{C@ cREVGeneral revUniqueID 1118328937685  Loudnessi(D cREVGeneral revUniqueID 1120920424547Actionep Non mouseUp switch the hilitedText of btn "ScriptChoice" case "Checking QuickTime Version" edit the script of this stack send "menuPick CheckForQT" to btn "handlers" of stack (line 1 of the windows) break case "Initializing the API" edit the script of grp "PlayGroup" send "menuPick InitializeAPI" to btn "handlers" of stack (line 1 of the windows) break case "Enabling the API" edit the script of grp "PlayGroup" send "menuPick EnableAPI" to btn "handlers" of stack (line 1 of the windows) break case "Disabling the API" edit the script of grp "PlayGroup" send "menuPick DisableAPI" to btn "handlers" of stack (line 1 of the windows) break case "Calculating Duration" edit the script of grp "PlayGroup" send "menuPick DurationTime" to btn "handlers" of stack (line 1 of the windows) break case "Play/Pause function" edit the script of btn "PlayPause" send "menuPick mouseUp" to btn "handlers" of stack (line 1 of the windows) break case "Tracking the Player" edit the script of grp "PlayGroup" send "menuPick ShowMusicProgress" to btn "handlers" of stack (line 1 of the windows) break case "Setting the loudness" edit the script of sb "Loudness" break case "Sound File in a Custom Property" edit the script of this stack send "menuPick CreateSoundFileFromCustomProp" to btn "handlers" of stack (line 1 of the windows) break case "Keyboard Shortcuts" edit the script of this stack send "menuPick keyDown" to btn "handlers" of stack (line 1 of the windows) break case "Calculating Elapsed Time" edit the script of grp "PlayGroup" send "menuPick ElapsedTime" to btn "handlers" of stack (line 1 of the windows) break case "Calculating Remaining Time" edit the script of grp "PlayGroup" send "menuPick RemainingTime" to btn "handlers" of stack (line 1 of the windows) break case "Backward Quick Search" edit the script of btn "Backward" send "menuPick mouseWithin" to btn "handlers" of stack (line 1 of the windows) break case "Forward Quick Search" edit the script of btn "Forward" send "menuPick mouseWithin" to btn "handlers" of stack (line 1 of the windows) break case "Looping" edit the script of btn "Loop" send "menuPick mouseUp" to btn "handlers" of stack (line 1 of the windows) break case "Export Scripted Group" lock screen select grp "PlayGroup" copy select empty choose browse tool unlock screen answer info "The scripted group is on the clipboard." & cr & "

" & cr & "

" & cr & "See important notes in the Discussion pane about installing this scripted group into your own project." as sheet break end switch end mouseUp -------------------------- on mouseEnter local tTooltip ----- if the label of me = "Show Script" then put "Click here to edit script about" && quote & the label of btn "ScriptChoice" & quote into tTooltip else put "Click here to put the API on the clipboard" into tTooltip end if set the tooltip of me to tTooltip end mouseEnter ;d=Click here to edit script about "Checking QuickTime Version" Show Script cREVGeneral scriptChecksumRޣi+ breakPoints handlerListmouseUp mouseEnterscriptSelectionchar 2971 to 2970 revUniqueID 1120920585665 bookmarks tempScript prevHandlerLoadUrlscript!

on mouseUp

switch the hilitedText of btn "ScriptChoice"

case "Checking QuickTime Version"

edit the script of this stack

send "menuPick CheckForQT" to btn "handlers" of stack (line 1 of the windows)

break

case "Initializing the API"

edit the script of grp "PlayGroup"

send "menuPick InitializeAPI" to btn "handlers" of stack (line 1 of the windows)

break

case "Enabling the API"

edit the script of grp "PlayGroup"

send "menuPick EnableAPI" to btn "handlers" of stack (line 1 of the windows)

break

case "Disabling the API"

edit the script of grp "PlayGroup"

send "menuPick DisableAPI" to btn "handlers" of stack (line 1 of the windows)

break

case "Calculating Duration"

edit the script of grp "PlayGroup"

send "menuPick DurationTime" to btn "handlers" of stack (line 1 of the windows)

break

case "Play/Pause function"

edit the script of btn "PlayPause"

send "menuPick mouseUp" to btn "handlers" of stack (line 1 of the windows)

break

case "Tracking the Player"

edit the script of grp "PlayGroup"

send "menuPick ShowMusicProgress" to btn "handlers" of stack (line 1 of the windows)

break

case "Setting the loudness"

edit the script of sb "Loudness"

break

case "Sound File in a Custom Property"

edit the script of this stack

send "menuPick CreateSoundFileFromCustomProp" to btn "handlers" of stack (line 1 of the windows)

break

case "Keyboard Shortcuts"

edit the script of this stack

send "menuPick keyDown" to btn "handlers" of stack (line 1 of the windows)

break

case "Calculating Elapsed Time"

edit the script of grp "PlayGroup"

send "menuPick ElapsedTime" to btn "handlers" of stack (line 1 of the windows)

break

case "Calculating Remaining Time"

edit the script of grp "PlayGroup"

send "menuPick RemainingTime" to btn "handlers" of stack (line 1 of the windows)

break

case "Backward Quick Search"

edit the script of btn "Backward"

send "menuPick mouseWithin" to btn "handlers" of stack (line 1 of the windows)

break

case "Forward Quick Search"

edit the script of btn "Forward"

send "menuPick mouseWithin" to btn "handlers" of stack (line 1 of the windows)

break

case "Looping"

edit the script of btn "Loop"

send "menuPick mouseUp" to btn "handlers" of stack (line 1 of the windows)

break

case "Export Scripted Group"

lock screen

select grp "PlayGroup"

copy

select empty

choose browse tool

unlock screen

answer info "<b>The scripted group is on the clipboard.</b>" & cr & "<p></p>" & cr & "<p></p>" & cr & "<i>See important notes in the Discussion pane about installing this scripted group into your own project.</i>" as sheet

break

end switch

end mouseUp

--------------------------

on mouseEnter

local tTooltip

-----

if the label of me = "Show Script" then

put "Click here to edit script about" && quote & the label of btn "ScriptChoice" & quote into tTooltip

else

put "Click here to put the API on the clipboard" into tTooltip

end if

set the tooltip of me to tTooltip

end mouseEnter

 LoudnessqDon mouseUp put the thumbPos of me into tPos -- current position switch case char -1 of tPos < 5 put 0 into char -1 of tPos break default add 1 to char 1 of tPos put 0 into char -1 of tPos end switch set the thumbPos of me to tPos ----- set the playLoudness of player (the uPlayer of grp "PlayGroup") to tPos end mouseUp --------------------------- on scrollBarDrag pPos -- pPos is a parameter provided by the engine which indicates the current position set the playLoudness of player (the uPlayer of grp "PlayGroup") to pPos end scrollBarDrag I) p 100 cREVGeneralscriptChecksum¨">TQsU bookmarks revUniqueID 1121240529384 handlerListmouseUp scrollBarDragscriptSelection char 66 to 65 prevHandlermouseUp tempScriptscript

on mouseUp

put the thumbPos of me into tPos -- current position

switch

case char -1 of tPos < 5

put 0 into char -1 of tPos

break

default

add 1 to char 1 of tPos

put 0 into char -1 of tPos

end switch

set the thumbPos of me to tPos

-----

set the playLoudness of player (the uPlayer of grp "PlayGroup") to tPos

end mouseUp

---------------------------

on scrollBarDrag pPos

-- pPos is a parameter provided by the engine which indicates the current position

set the playLoudness of player (the uPlayer of grp "PlayGroup") to pPos

end scrollBarDrag

!Horizontal DividerK`0Hh cREVGeneral revUniqueID 1121435601430"Horizontal DividerK`0Eh cREVGeneral revUniqueID 11214356325138 PlayGroup y0Z## Player monitoring by Eric Chatonet - july 2005 ----------------------------- ## handler sent repeadetly to monitor music progress on ShowMusicProgress pPlayerName,pScrollBarName,pFieldName if there is a button "Loop" then set the looping of player pPlayerName to the hilite of btn "Loop" if the paused of player pPlayerName and (the currentTime of player pPlayerName = the duration of player pPlayerName or the currentTime of player pPlayerName = 0) then lock screen -- refreshing icons: set the icon of btn "PlayPause" to the ID of img "PlayNormal.png" set the icon of btn "BackWard" to the ID of img "BackwardDisabled.png" set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png" if there is a sb pScrollBarName then set the thumbPos of sb pScrollBarName to 0 if there is a fld "ElapsedTime" then put empty into fld "ElapsedTime" -- added for consistency if there is a fld "RemainingTime" then put empty into fld "RemainingTime" -- added for consistency if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player pPlayerName unlock screen set the playLoudness of player pPlayerName to the uCurLoudness of player pPlayerName exit ShowMusicProgress -- we do not need this pending message any more else lock screen if there is a sb pScrollBarName then set the thumbPos of scrollBar pScrollBarName to the currentTime of player pPlayerName -- the scrollbar endValue is the duration of the sound: the currenTime will show the current position in the scroolbar put RemainingTime(pPlayerName) into fld "RemainingTime" -- put ElapsedTime(pPlayerName) into fld "ElapsedTime" -- -- see ElapsedTime and RemainingTime functions below unlock screen end if if ",ShowMusicProgress," is not in the pendingMessages then send "ShowMusicProgress" && pPlayerName,pScrollBarName,pFieldName to me in ((1 - (the long seconds mod 1)) / 5) seconds -- we send this message well settled with the internal clock each 200 milliseconds end ShowMusicProgress ----------------------------- ## Player group initialization on InitializeAPI pFilePath local tPlayerName ----- put the the uPlayer of me into tPlayerName set the fileName of player tPlayerName to pFilePath if the duration of player tPlayerName = 0 then DisableAPI -- -- see DisableAPI function below answer error "File not supported." else set the thumbPos of scrollBar "MusicProgress" to 0 set the endValue of scrollBar "MusicProgress" to the duration of player tPlayerName set the thumbPos of scrollBar "MusicProgress" to the currentTime of player tPlayerName put ElapsedTime(tPlayerName) into fld "ElapsedTime" -- put RemainingTime(tPlayerName) into fld "RemainingTime" -- -- see ElapsedTime and RemainingTime functions below EnableAPI -- -- see EnableAPI function below end if end InitializeAPI ----------------------------- ## Disable commands when, for instance, not any sound file has been chosen on DisableAPI lock screen put empty into fld "ElapsedTime" put empty into fld "RemainingTime" set the icon of btn "Backward" to the ID of img "BackwardDisabled.png" set the icon of btn "PlayPause" to the ID of img "PlayDisabled.png" set the icon of btn "Forward" to the ID of img "ForwardDisabled.png" set the enabled of grp "PlayGroup" to false unlock screen end DisableAPI ----------------------------- ## Enable commands when, for instance, a sound file has been chosen on EnableAPI lock screen set the icon of btn "PlayPause" to the ID of img "PlayNormal.png" set the icon of btn "BackWard" to the ID of img "BackWardDisabled.png" set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png" set the enabled of grp "PlayGroup" to true unlock screen end EnableAPI ----------------------------- ## returns the total duration of the file in hours, minutes and seconds: function DurationTime pPlayerName if the timeScale of player pPlayerName = 0 then return empty -- means that the file is not supported by QT return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName)) -- C -- see ConvertTime function below end DurationTime ----------------------------- ## Returns elapsed time since the beginning function ElapsedTime pPlayerName if the timeScale of player pPlayerName = 0 then return "Non available" -- means that the file is not supported by QT return ConvertTime(round(the currenttime of player pPlayerName/the timeScale of player pPlayerName)) -- -- see ConvertTime function below end ElapsedTime ----------------------------- ## Returns remaining time until the end function RemainingTime pPlayerName if the timeScale of player pPlayerName = 0 then return "Non available" -- means that the file is not supported by QT return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName) - round(the currenttime of player pPlayerName/the timeScale of player pPlayerName)) -- see ConvertTime function below end RemainingTime ----------------------------- ## Converts seconds to hours, minutes and seconds function ConvertTime pSeconds local tSeconds,tHours,tMinutes ----- put pSeconds div 3600 into tHours put pSeconds mod 3600 into pSeconds put pSeconds div 60 into tMinutes put pSeconds mod 60 into tSeconds ----- if tSeconds < 10 then put 0 before tSeconds if tMinutes < 10 then put 0 before tMinutes ----- if tHours <> 0 then return tHours & colon & tMinutes & colon & tSeconds else return tMinutes & colon & tSeconds end ConvertTime ----------------------------------- function MyRound pNumber -- this function is used due to a bug: you have to set the pageInc to 9 to get the ticks displayed correctly with OS X on the loudness scrollbar -- and we want the playLoudness to be a multiple of 10. So we make a correction: -- note there are no ticks visible with Windows switch case char -1 of pNumber = 0 return pNumber case char -1 of pNumber < 5 put 0 into char -1 of pNumber break default add 1 to char 1 of pNumber put 0 into char -1 of pNumber end switch return pNumber end MyRound xUuPlayerTest cREVGeneral scriptChecksumFΧ9ێ&Ou breakPoints handlerListoShowMusicProgress InitializeAPI DisableAPI EnableAPI DurationTime ElapsedTime RemainingTime ConvertTime MyRoundscriptSelectionchar 4238 to 4237 bookmarks revUniqueID 1121507922073 prevHandler ElapsedTime tempScriptscript80

## Player monitoring by Eric Chatonet - july 2005

-----------------------------

## handler sent repeadetly to monitor music progress

on ShowMusicProgress pPlayerName,pScrollBarName,pFieldName

if there is a button "Loop" then set the looping of player pPlayerName to the hilite of btn "Loop"

if the paused of player pPlayerName and (the currentTime of player pPlayerName = the duration of player pPlayerName or the currentTime of player pPlayerName = 0) then

lock screen

-- refreshing icons:

set the icon of btn "PlayPause" to the ID of img "PlayNormal.png"

set the icon of btn "BackWard" to the ID of img "BackwardDisabled.png"

set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png"

if there is a sb pScrollBarName then set the thumbPos of sb pScrollBarName to 0

if there is a fld "ElapsedTime" then put empty into fld "ElapsedTime" -- added for consistency

if there is a fld "RemainingTime" then put empty into fld "RemainingTime" -- added for consistency

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player pPlayerName

unlock screen

set the playLoudness of player pPlayerName to the uCurLoudness of player pPlayerName

exit ShowMusicProgress -- we do not need this pending message any more

else

lock screen

if there is a sb pScrollBarName then set the thumbPos of scrollBar pScrollBarName to the currentTime of player pPlayerName

-- the scrollbar endValue is the duration of the sound: the currenTime will show the current position in the scroolbar

put RemainingTime(pPlayerName) into fld "RemainingTime" -- 

put ElapsedTime(pPlayerName) into fld "ElapsedTime" -- 

-- see ElapsedTime and RemainingTime functions below

unlock screen

end if

if ",ShowMusicProgress," is not in the pendingMessages then send "ShowMusicProgress" && pPlayerName,pScrollBarName,pFieldName to me in ((1 - (the long seconds mod 1)) / 5) seconds

-- we send this message well settled with the internal clock each 200 milliseconds

end ShowMusicProgress

-----------------------------

## Player group initialization

on InitializeAPI pFilePath

local tPlayerName

-----

put the the uPlayer of me into tPlayerName

set the fileName of player tPlayerName to pFilePath

if the duration of player tPlayerName = 0 then

DisableAPI -- 

-- see DisableAPI function below

answer error "File not supported."

else

set the thumbPos of scrollBar "MusicProgress" to 0

set the endValue of scrollBar "MusicProgress" to the duration of player tPlayerName

set the thumbPos of scrollBar "MusicProgress" to the currentTime of player tPlayerName

put ElapsedTime(tPlayerName) into fld "ElapsedTime" -- 

put RemainingTime(tPlayerName) into fld "RemainingTime" -- 

-- see ElapsedTime and RemainingTime functions below

EnableAPI -- 

-- see EnableAPI function below

end if

end InitializeAPI

-----------------------------

## Disable commands when, for instance, not any sound file has been chosen

on DisableAPI

lock screen

put empty into fld "ElapsedTime"

put empty into fld "RemainingTime"

set the icon of btn "Backward" to the ID of img "BackwardDisabled.png"

set the icon of btn "PlayPause" to the ID of img "PlayDisabled.png"

set the icon of btn "Forward" to the ID of img "ForwardDisabled.png"

set the enabled of grp "PlayGroup" to false

unlock screen

end DisableAPI

-----------------------------

## Enable commands when, for instance, a sound file has been chosen

on EnableAPI

lock screen

set the icon of btn "PlayPause" to the ID of img "PlayNormal.png"

set the icon of btn "BackWard" to the ID of img "BackWardDisabled.png"

set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png"

set the enabled of grp "PlayGroup" to true

unlock screen

end EnableAPI

-----------------------------

## returns the total duration of the file in hours, minutes and seconds:

function DurationTime pPlayerName

if the timeScale of player pPlayerName = 0 then return empty

-- means that the file is not supported by QT

return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName)) -- C

-- see ConvertTime function below

end DurationTime

-----------------------------

## Returns elapsed time since the beginning

function ElapsedTime pPlayerName

if the timeScale of player pPlayerName = 0 then return "Non available"

-- means that the file is not supported by QT

return ConvertTime(round(the currenttime of player pPlayerName/the timeScale of player pPlayerName)) -- 

-- see ConvertTime function below

end ElapsedTime

-----------------------------

## Returns remaining time until the end

function RemainingTime pPlayerName

if the timeScale of player pPlayerName = 0 then return "Non available"

-- means that the file is not supported by QT

return ConvertTime(round(the duration of player pPlayerName/the timeScale of player pPlayerName) - round(the currenttime of player pPlayerName/the timeScale of player pPlayerName))

-- see ConvertTime function below

end RemainingTime

-----------------------------

## Converts seconds to hours, minutes and seconds

function ConvertTime pSeconds

local tSeconds,tHours,tMinutes

-----

put pSeconds div 3600 into tHours

put pSeconds mod 3600 into pSeconds

put pSeconds div 60 into tMinutes

put pSeconds mod 60 into tSeconds

-----

if tSeconds < 10 then put 0 before tSeconds

if tMinutes < 10 then put 0 before tMinutes

-----

if tHours <> 0 then return tHours & colon & tMinutes & colon & tSeconds

else return tMinutes & colon & tSeconds

end ConvertTime

-----------------------------------

function MyRound pNumber

-- this function is used due to a bug: you have to set the pageInc to 9 to get the ticks displayed correctly with OS X on the loudness scrollbar

-- and we want the playLoudness to be a multiple of 10. So we make a correction:

-- note there are no ticks visible with Windows

switch

case char -1 of pNumber = 0

return pNumber

case char -1 of pNumber < 5

put 0 into char -1 of pNumber

break

default

add 1 to char 1 of pNumber

put 0 into char -1 of pNumber

end switch

return pNumber

end MyRound

+JBackwardHilited.png HPNG  IHDR9 pHYs  gAMA|Q cHRMz%u0`:o_FIDATxڌ@фQT\-%ZU13]|KfwGD 3y=A ?0 v2bmlIA7u * !(5g1b+3@ܣ~ҡ%j-4 !`\'x_-9%9"g&JBS熈+}Pj@+&1G`x߾}cx%Ûol 2 Llٸf`a`5:W>cqqq> &l>}bx1Û , ,6  L`&&$ Eѣ 'N'MK< v %`P `Ѐ~zYi1< ̙; _xd0B-[ $C~=>,2CJJ _Ǐ B ,`C짷N0]ׇ*M5wa/*.A`@ X`CL !W1ܿ|!|ȉ$w  h-,X=@ؾϟx5%XPd0Ƞ{!3@2ܽ/ҟ3g_2p3Bs_ ۷o@,,l ߿}gfK@K/ew a)2:dBhhLP3 1|{   nȰ{B ο@݇nn*PV @5!@a6`;\˫XSmmn; ƟAAJDۊ\?q L(9bcbbf P[^nb x 1`b pwcP Lax*p?D2"r /P`( {s\lM12< ¼ o^``d@/aA{4P8#T50:o^dP@`?|ɰ ’ւT B Ŭ\1 B>g`~xA^1qW._f򉙁3`e@-Jl 1_#xW0ee055k xjfdx~v;j3((aӳgx 8BiFΠ`bb)gΜas.40AA X@,%%! 0>PC aa| :ۛ /^ b}J ?~-,`V!\.SƄPfB̹p(11 oa92$*fW0 "0#e `gOb?g %`Y & eF8τgd:f=?ӿ! @L8Y--MpdDeps€:m&Qo^3031(;|?(utt@ `B &j B 150A^N\.E@1(oɂL6O80a1LP@q$L #8D߼y' $,  wO> o0"0yq!j&Ft0yidTû@v01JR`gx101 ;+ϟ?3HHJ};v H@z9~ Lf`E_~e`cac\@XXڵk?@2|AXHs =zSԺU@rG;S/09C1 ȳ`!u0jAE7^ba ?#а ===5`A7nd9sR(.63@YYe> p R&i s@ZÀ8:}ٳ(_@A1@v`xaiښX lni`nnphSj@6 YF6LPû_Tb X3|AA^>̏߀'3c8 4 O Z'00Xa (4@` 8%>>bmwMGG챟?~2&h!*rrr V 8taP*+/`me #+%+`efK51\ ĸa`0ܔdn^p0  NC?HG$*(AU@)Pgҥ\O ! 㼼<@W]'6P|"(Ȑ* e j ?l0 U*Eŋ R 0Pd&k@ +^bY`( (,}N%P|h f1 (Z~ h(ZEDD KAׯ_3, &X X0wN`ˀ+@6&$6Ap16ZP A 2۷2T?K`(hfBdDe 3"#;q 2d0a%&@-8 PEJ :Ԇ?x 0 ,`?ŋ(5@@VV'@P\FFF4Aܹs .]7U61: UVa50| ˗3(**Cx@Un,|z} ,AӧR#zqʕ8R!!._DT@CD rI2N ghp4wǐ@1^8Z]>u Ae2P(PB:IENDB` cREVGeneral revUniqueID 1121506737312+LForwardDisabled.pngHPNG  IHDR9 pHYs  gAMA|Q cHRMz%u0`:o_FIDATxڌA 0,OMۊj3sz7f&UW@#1B?T (36Eqx/6Z3CXrޟ9P΂zUzY u1 9/~  0PĚ 0 2ĐBX)-Z/N3yg8sFJ 1FvBDPkE)?`B uaB `O0(?~pu0y@BBqڵϟ3(++3}J*ę3gܽ - -q1F...@(rw|А@*i aLC9pEFf"")<0C륦@F*hH*@z܎*|rN.InC\.ٍ3#Y!9l9fx X##7`28p8Fw A} yyy`9 d0 $@nBG " y2Nx . ~l9ș߼fNq`L03fdb;&ccP^)&&kHb @?(uut|1 j01LL0_!h&4P J<7`6P @L8,ĉ O> |`6X ԛw>cGp @'p!Odи CAX,9)%BS~2ZcP@{qqqǏ- P )2#!Ol9(V @3B,FfA22r@%a l&AbHy 0&YT (3<& KK[*Tp - b/6 r?jd   S h(:H0JH?v_`0bk[D" Ao`f@,C \c-\bmcWFb9`mm7B}YNaAh`Bn/~`V@ >"0ժ2HHJK>W^[F Am/_qb@(9~3+)mC N!jX|<33+ǁ!, lTibNAU*>ë/ 0`t0 3@0X rz6{w3zAOO5@Tv6(ş8~``adBNo(aIرܒ jL,@1YUp1sPecoo-,H&@o+++p,jQ*BT6&o2;wҥK&7(4)Έ v>{$%$%%{˗/ &%P]̯vاW Gi!_,gD7 F|EPP+*AiT:L #- t ''ë2BqÆ X-FP[Ph@)jA TXB0",fv+zIENDB` cREVGeneral revUniqueID 1121506737684+MForwardHilited.pngHPNG  IHDR9 pHYs  gAMA|Q cHRMz%u0`:o_FIDATxڌ @ZtPGsPKoy&+* ےDD 3U e}N-ζE} iKϞ3( v87BWD3 缛C? IݲXl4-.5-fDMrPX=3*3FFz=!#pZ>mڴ/^`x󍍁A@QPUfL}`*Çk "\$$$: Z>qϟ?gĪ"n![$ E ԁS o3HIJ1a8 0,_``Eq@X>gΜwek&P{@a#B9X`j=9, JB d3?CS,A dyfy_nfx )O`SS}y J3a,0>f1eav߼f`5d`Dأ08Z*DJq O_ J ..ifV42C\`3 0#A}"7ãsk1Ãw(c`% X@1[XXy&5+? 3"8`>~1O@’r hj>~p12< $#C,L`f 0Yk V`eA_L r+5@_XPłAPՒORcf;3@2/Q P d32>yAٷX tz&?; *lE P ~b`ecc &` 3qc''kH%%ý}X+'HW}6@8xQʪ'2|Z Rn&Dj[3iYK?PĄ7 5ZV@u(D??l/ 1<Z``q ӱƨۘ$BZ9G/ X@M\LΫG `5)90AySRߚAŁٌCf05zVXjX 8@, BZF  /00s0 2K.R""(A1bT-< (@@꿼g`{AȆ X<<<Ϝ9_R _4)πH?5')^?2hjj2=qᏄ$FzF9N}2!×/_roL?w ~df`[ nF5:fj8g}6_CC#CCVbBRauv`cb`e`fHbPqPT1X=H acxIҌ:tf`+Бc =^5|ZRc[ 6Vnmm Dh@8q,pq" v RF!r+PW ,`b055E=t>z>>> .0\z]^ʌE@ 8×~> '/```N666Aiؿ I 3\|7 ̢r r l"R |Zߏo ?eÏ~Ġ*)  ,,+{;;"W( 0<}˗ >|WŜ|+ ,d898^@1K=x~~~`G!v RPϟN7_2|֖*@I;IENDB` cREVGeneral revUniqueID 1121506737745+NForwardNormal.pngHPNG  IHDR9 pHYs  gAMA|Q cHRMz%u0`:o_FIDATxڌA 0,OMۊj3sz7f&UW@#1B?T (36Eqx/6Z3CXrޟ9P΂zUzY u1 9/~  0PĚ 0 2ĐBX)-Z/N3yg8sFJ 1FvBDPkE)?`B uaB `O0(?~pu0y@BBqڵyLLL>%B̙3 we#J `ݻw_|`hh`ck L 4H0 t!BP b ^^ Gft"#3ap@R*R/Af```?<3l  F0 L0@k \p?rFP"[r??`gg ؿ09]bǡB0yy_|'H^^^X &PvwLMك%aLP0201B"H34D@.Tph:z ?'P ~ASK :53 fW:L Ayd(ׯ! {bI  b`&c`BLh )99yo ̛deeP] &L`8y`HCԜbx ,޼{)0Ў>dba>}"Dkq 0P8,xxx@5/߾~|70) 0#$C42)S@j`?07} l9(V @3, X*- b&8k10} Rcbf/AĿ(=r>P (3<& `;/`Jead0j 5 D r?p274X J| Ȟf0^kL1} ۷&{`9 ~@Qh4 B}@d B#T HxV,]`mc l%}g o߾17(eZX10 M&TX` X7~`K@/ >*.+}UUU II4/#?T7@ _|'bb@(d̬09 68͆h&#ac#A̬QDDAبV2 Oկ*U__ vZ†f0:XX ,τf9 L=^xɠXÁ 5P J*}OFPCà 9%&9ڱc% 9o5kPq`\̀fPecoon @M2ߠTu P,mmp5@eddN۷oΝ;p%p@ gDW @v;r ==˗K@EEEpH.+]>|v.*>| uAA^߿?2.tu@]'P#AFZA@NNW_BqÆ X-FPw [Ph@)jA XXC03fc1 #+6WB<IENDB` cREVGeneral revUniqueID 1121506737803+OPauseHilited.png H'' ȉPNG  IHDR''Q5 pHYs  gAMA|Q cHRMz%u0`:o_F >IDATxb?9` s@!!!;P:'0@jP\ҔZûpOj9&}'O(gI "Zs3_%`j~PXOcMq='xs4 YQ B!ދw Bv4UUrJ~@;~OQ9$&0 Pl5 n20| AHHHB @x7o޼ϟ?gxo^mfFvA܄p9*$CRRNN͞=ӧO^~f```Aj8?`(yqA+ Cr h L_?fxGEڞK @9U܁hAßDX^23$%c @`3ٳ o3ɻ20qBa;d>%*#87v30?y՛r]]]cbPb`tbqo?2 &dxCƊW fbH3!1!h^V=V |e>m7%Z_zOPKL#Q!C׷QT1 1bUex.\=@! #*ulp1@!~cûX>11<{ :s8%X@b eb&:P2+Ajp_VF )= mϟ?1p}00%/##fJO~FXtLc|/QLRglL| "#B ψ]* Hi )?gx/p[9_u/ˮ];A_r Ja_fL_ ʈ-W]v fV?~0C5֢ Q$v$uc;/ȒUR _|v&xƁWPsv @,V߿X98!^q0g3A- `G n1%cހ,2 accUJ%Ichcl#Y#ENl v  G6.NS`zÏXYꙘ12TZ2}  nQ K4Ą=C Q%0Y޿cfx.JrxC`* LlGnEjX0_o~5 ('vhP,PS&MHu- @@LnnnV =WW!.`BEr'v&H"c:h5.S2 a& +l֯e`puue HL$b _e`ax/H+?f- ]P01bo +a15)1xY @f '11`ȀH& ~p"ëiFh?)}-þ >`fpvvf x왳O>p]H?^V+L!WpG-c _'3h~`nn`dd6 P::: OcXUQM-w#f LN|/n2[1yn&@?5ED z,J ! eזgf07 @]+?{,?x\=}aԀπa\K랍 b ƠC1 0'O02h 15{ީa,Ć;;,b,H 6 dt(@aسgPYsys2Z;1p`=,0IXbCG1 30|#@''+pm3o0Saනf`EH|{QWwLt5TT>{䄵 sΝJ.^p[v9M.v)1Z' \`>,c@5wR >|dqO=%Aq9v)6Qn>&Pßo~s/1Ϡ*/àN_B Ic/** YLIENDB` cREVGeneral revUniqueID 1121506737862+PPauseNormal.png HG'' ͉PNG  IHDR''Q5 pHYs  gAMA|Q cHRMz%u0`:o_F CIDATxڔ 0CQS(C\wmU%̔0TuYC[~a#Hbi{I5 Dp1/639 CUa#ለ)۬![ 3P_SF`:9?45бC^r9jGzfF)%/c̠BDPl0Mφ6}>[b-A22 g@098DDD/_du߿B A! s$: \ LS`=r zzz  M atׁf~gr +++ X"m߾}S...UUUDHaGǠ!+@Q --p)G1eli X`q 'ODEElmm4z10" D4UU5AÇ3tܛh:{r K; &48[ 00PeE0D(Ap0WS`G0@1?O>+8u0}_|aPF-QkMMMp pBCC.f bd,ëo( V} Q|Ĉ~i!ˈf|A?  1[^}ACCAXX9c aaaXKUVy-0=7@wJ \:N@0)X1 930%  Bkp JZU}t@ǏAYZJJLxD " 0 cD!Qo@L,:NDDc OILHQ*_!L lL,(8$/ h\,E%>5WaLJ(SVj0313= .DEŠ3ê%<Ą0(5@ 0`u*( YV 1|Hdq\;X v;@,x 0(^{@E @r` j41_Av&h) ҏ>{XYX+A"%@YT`4o!\iaAjL PP̨!@p?TG R&&H? !0P2 p , ߀s,r -P! Qs%Rc AeBrL ,h% &htC   E*((Fw`T^2 > kMT.j(f8A՗08  qd7` ԇ ,*$1ArJb@&H $nE,| ?Ha0ۓd ٖ"E3(@eoAi#PhA}h1!PaA1M,P-ahB5Gp X@ jꕫ /0d(X)e ʣ`X?xu6 ]σs/ # L`nHȹSY{޾} ךC% l"3!( خ64>@~\.Ҋt""çyGw~#(z:kg 5P!MQB,Pg0  PuU ߽{Ǩ 0ٽ݇ЀD ,$XbPbp1 <\? xe`@/޾; f&@ aP00{pS[6mbxl[!'j&,ll|BAm6Ȉ6&  0+sSspYf ˗ @ojfsp  (C^߿-MMLn߽ͰsN0XZZPb?~8͛7ԁ==5UϞ2| >^ ˗lZF8Q*pb$fLX\\?hjq2PcAAAcD j c 8yFCC/_2b d>@8_S#9PZYr$ AMPC=!X!dz/s`\(A@b ? 9 C~{.3`*gfIENDB` cREVGeneral revUniqueID 1121506737925+QPlayDisabled.pngH'' PPNG  IHDR''Q5 pHYs  gAMA|Q cHRMz%u0`:o_F IDATxڔ 0CQS(C\wmU%̔0TuYC[~a#Hbi{I5 Dp1/639 CUa#ለ)۬![ 3P_SFX`!~Yf X3F:6ˍ.)mAbH)!"zXU{fFμι7a=z{b-A22 g@RvQuuu˗/nݺzFH!y9 )Þ?9mmm===AAAz ͈&0\t@33HJJ9k ,H]o߾) *"0#cĕƁrwpp`b8yãGddd2 @,8GΉɓ' `= p?"C Ç?~ /'/''F & g{PSpBwvrfFx`bF&/6"gb`z}P(2 Ld/H(a s (NN.p = a`ă aMa:P4&`,ab9߿ >}W p*a= |Ç+ Zի "->%$ć84]@H>YYYWK PP344D#Z'N V&PbBȁ2Vz4,=22|A?`@n xQXkhh0Jp܏dx,b@ D#GׇGo߼e;`Pr@1!k@ǩ#Ш{)8C)\L?<9& FhI J_o޼Ѡ% (ꃥ;bǏ4ZĈ( S`Q°P\_?~1~Ԉ`baၹ X@qJJ0Z Aal3?`1K P ,>}@AABBks'B`C)+P0&%p)A d1 @+la#j͈!8>a_DUIl@ 0&09TP@V 1|-QX6>A (%% .)v t/= PЂr ][ KA BִCA$в'33H3Bs=, *@"} _}\c+̓b'PcBRh X@@0d6Ձop? W! XgCY ǀpR2p5AB= b 50|αV -P! AJL,(j04m,: TIKK05 0Mb t= @,WY/_`ah.afbB066Q' %i)YHF-$#9 9P%,$ NBtoQ`j2CKq 0NLY`HCK"j# !PFTD }8w 03[^ (! @Q@gb@H+2IKW`H `?&cB찧6G S Po X@ ԤUW\;/0= Z ht33H?,0=3KĊ],@2`$DŽH ۷vPer@DEE &?G j.dB' 'r^=oPo>@[ASЁA!@l ago D32GjA|pfbA٠Ο aaP`1@1P} ڛׯC-B8 j10s  l0ˠ`ؘXAzy&Ý;4P}Tރ1|U`(CxІ2 "ԡb_d8x^V` 5XW @q .@@5`Wzس{'ûXH0`b,1dy~_ `f#&(S -61 Mt66>!6|PqdddA BmxFЕ98ǬY  @713cx98`-  {Pnojbpm;w2PC[9_u/ˮ];A_rD7iOe>2b_nϾ2ڵ?@02񃁝m:,Co_@70ޝ=Q5KA P@<02P X@߿3rpBK4@Z!p;ظsU|RX8 aae PL8P,T*Lë31 g% iZBJ9PMퟟ` hb ~|d` Zj)0g=:0Q321icD%Zʈ__5HD1[Tâ?0 2\DAT-[8`@zL o߿``VE1<+0A1A#ULNJAX|hD|SFY`1~@,'*&#pQk`H=P# j[12MBϚA Z@h sR] b0x -,1#G3]S`J3 bĈFhԷb%Dhk{ܾ-5#@@,cbcx* ë_~)gJX3H5$VK0WGn JF(@G'103|fd`C/cl ed t BëiF(ht~ ,1G@ }g?u-vIfS"?ur; FFF`1X 8b^ؿɉM{+7o =W0p0H"_ޟEvR) $y R pSkxgϝe'?/Q#?AX*4q_`uF}1vcccP̡@eO {PڑA`P]IfAbw#`c: {/!!pys2Z;1p`N r%6$o]a|t0/\\1 p{rr f8s/1nk6!QDAj&ze(\ an5×#G^a0dPSQex)  ϝ;w?*x"o4L إd0Ky%O5Mi}}}` ^dD޽{KKK1|ƍ >8EDX8@M }d7~|= &??8} -d@$ 8p࿨( ɓ' ^?f';;;///#.& ?7 D #9۷oc@~P HP?˗/` ===IQ0o|IENDB` cREVGeneral revUniqueID 1121506738284+SPlayNormal.pngHR'' $PNG  IHDR''Q5 pHYs  gAMA|Q cHRMz%u0`:o_F IDATxb?9` s@!!!;P:'0@jP\ҔZûpOj9&}'O(gI "Zs3_%cA T< 4`Z s"H503J);p̅月;Tfa"J{?J@A1q `[`F0B4# ݺu Af"qs?~0hjj21 2 ޿p%73p\RR!)) fϞӧ \\\ BaK۷N<7Yd @XJ_?feӘ:Y?qLkÇi999 i|)8;;93x`bF&/6"gb`z&&&>( >yr]]]Ai @9zΝ2 %%Oׯ ܈2 {@}ai(!@Lx Εp HL(.RHgfd1d,ëoPB 1cPnhh3&F&L6&PbBȁ2Vz4,=22|A? 07 [ `(-'N%Y=>d> }-{o;Thh#uP$ !5*!9ʊH3B~b vp@ s%%eH?~A$.Grw| 1&@ta>} 0HHH r݄<&4$MhG?2l@Q)AAXDܒbٵk'lhbCa:`HK#--mp؀4JAV*( rϮ] 3+8!.t7 3VR>tM e'9h vX P5d)%xf@ϟ?i F LY}P2 dcc;lb@+~,j-'LMLLLLL ab r52&f&bY j \?`yO؂+%19 p r(I o9*?*$A4(Q$ HMxfʚP53?&x1J6p.e@)@@ǁ꬀/^0 ?h$6DBk Ff0otQJ[,LbBԙU_>( qvۣG0 , 5?$,,́XYBlgA8o#y8#G_rPBZJh&pe;l)Q r5֫V'B P11 `=e#5#@@TW\;/0= Z hv4Y*TX[0 $LL,@2`$JHu6 K6V NTTTe=0 nAU "fPs!:=[kMއ8{SO1s',C `H# A7n-5ࣛ 37(} -d@$ 8p?cee[r$ AC"h4+t8 S@o޾  FrFӷoT1(@ Ak#A!0z$ `FಱIENDB` cREVGeneral revUniqueID 1121506738349D BackwardjC $-- To set the icons for this button -- its autoHilite property has been set to false -- and different status are coded -- Here we use a custom property and take benefit of a setProp structure -- In addition, note that the name of the player we want to monitor is stored -- in a custom property (uPlayer) of the commands group -- the code tests if some objects which are not owned by the commands group do exist and act accordingly on mouseEnter set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me)) -- G -- see this function in group's script if the icon of me = the ID of img "BackwardDisabled.png" then set the tooltip of me to empty else set the tooltip of me to "Increase backward speed with the option key" end mouseEnter -------------------------------------- on mouseUp if the paused of player (the uPlayer of the owner of me) then exit mouseUp set the uHilite of me to false set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me) set the playRate of player (the uPlayer of the owner of me) to 1 if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me) end mouseUp -------------------------------------- on mouseDown if the paused of player (the uPlayer of the owner of me) then exit mouseDown set the uHilite of me to true if the playLoudness of player (the uPlayer of the owner of me) > 20 then if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to 20 set the playLoudness of player (the uPlayer of the owner of me) to 20 end if end mouseDown -------------------------------------- ## allow to monitor the play rate on mouseWithin if the mouse is up or the paused of player (the uPlayer of the owner of me) then exit mouseWithin if the optionKey is down then set the playRate of player (the uPlayer of the owner of me) to - 10 else set the playRate of player (the uPlayer of the owner of me) to - 3 end mouseWithin -------------------------------------- on mouseRelease if the paused of player (the uPlayer of the owner of me) then exit mouseRelease set the uHilite of me to false set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me) set the playRate of player (the uPlayer of the owner of me) to 1 if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me) end mouseRelease -------------------------------------- setProp uHilite pFlag if pFlag then set the icon of me to the ID of img "BackwardHilited.png" else set the icon of me to the ID of img "BackwardNormal.png" pass uHilite end uHilite @uHilitefalse+I cREVGeneralscriptChecksumǫ*]4x8 revUniqueID 1121507236757 bookmarks handlerList=mouseEnter mouseUp mouseDown mouseWithin mouseRelease uHilite tempScript prevHandler mouseWithinscriptSelectionchar 457 to 468script 

-- To set the icons for this button

-- its autoHilite property has been set to false

-- and different status are coded

-- Here we use a custom property and take benefit of a setProp structure

-- In addition, note that the name of the player we want to monitor is stored

-- in a custom property (uPlayer) of the commands group

-- the code tests if some objects which are not owned by the commands group do exist and act accordingly

on mouseEnter

set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me)) -- G

-- see this function in group's script

if the icon of me = the ID of img "BackwardDisabled.png" then set the tooltip of me to empty

else set the tooltip of me to "Increase backward speed with the option key"

end mouseEnter

--------------------------------------

on mouseUp

if the paused of player (the uPlayer of the owner of me) then exit mouseUp

set the uHilite of me to false

set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me)

set the playRate of player (the uPlayer of the owner of me) to 1

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me)

end mouseUp

--------------------------------------

on mouseDown

if the paused of player (the uPlayer of the owner of me) then exit mouseDown

set the uHilite of me to true

if the playLoudness of player (the uPlayer of the owner of me) > 20 then

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to 20

set the playLoudness of player (the uPlayer of the owner of me) to 20

end if

end mouseDown

--------------------------------------

## allow to monitor the play rate

on mouseWithin

if the mouse is up or the paused of player (the uPlayer of the owner of me) then exit mouseWithin

if the optionKey is down then set the playRate of player (the uPlayer of the owner of me) to - 10

else set the playRate of player (the uPlayer of the owner of me) to - 3

end mouseWithin

--------------------------------------

on mouseRelease

if the paused of player (the uPlayer of the owner of me) then exit mouseRelease

set the uHilite of me to false

set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me)

set the playRate of player (the uPlayer of the owner of me) to 1

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me)

end mouseRelease

--------------------------------------

setProp uHilite pFlag

if pFlag then set the icon of me to the ID of img "BackwardHilited.png"

else set the icon of me to the ID of img "BackwardNormal.png"

pass uHilite

end uHilite

E PlayPausejC ,-- To set the multiple icons for this button -- its autoHilite property has been set to false -- and different status are coded -- Here I use a custom property and take benefit of a setProp structure -- very handy! on mouseUp set the uHilite of me to false CancelMessage -- -- see below lock screen if not the paused of player (the uPlayer of the owner of me) then stop player (the uPlayer of the owner of me) set the icon of me to the ID of img "PLayNormal.png" set the icon of btn "BackWard" to the ID of img "BackWardDisabled.png" set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png" else set the endValue of scrollBar "MusicProgress" to the duration of player (the uPlayer of the owner of me) set the playRate of player (the uPlayer of the owner of me) to 1 start player (the uPlayer of the owner of me) ShowMusicProgress (the uPlayer of the owner of me),"MusicProgress","ElapsedTime" -- G -- this important handler which monitors music progress is in the group's script if there is a btn "Loop" then set the looping of Player (the uPlayer of the owner of me) to the hilite of btn "Loop" set the icon of me to the ID of img "PauseNormal.png" set the icon of btn "BackWard" to the ID of img "BackWardNormal.png" set the icon of btn "ForWard" to the ID of img "ForWardNormal.png" end if unlock screen mouseEnter -- to refresh the tooltip end mouseUp ----------------------- on mouseDown set the uHilite of me to true end mouseDown ----------------------------- on mouseRelease set the uHilite of me to false end mouseRelease ----------------------- setProp uHilite pFlag if pFlag then if the icon of me = the ID of img "PlayNormal.png" then set the icon of me to the ID of img "PlayHilited.png" else set the icon of me to the ID of img "PauseHilited.png" else if the mouseLoc is within the rect of the target then if the icon of me = the ID of img "PlayHilited.png" then set the icon of me to the ID of img "PauseNormal.png" else set the icon of me to the ID of img "PlayNormal.png" else if the icon of me = the ID of img "PlayHilited.png" then set the icon of me to the ID of img "PlayNormal.png" else set the icon of me to the ID of img "PauseNormal.png" end if end if mouseEnter -- pass uHilite end uHilite ----------------------------- on mouseEnter set the tooltip of me to empty if not the paused of player (the uPlayer of the owner of me) then set the tooltip of me to "Click here to pause" else set the tooltip of me to "Click here to start" end mouseEnter ----------------------------- on CancelMessage local tLineNo ----- put lineOffset("ShowMusicProgress",the pendingMessages) into tLineNo if tLineNo <> 0 then cancel item 1 of line tLineNo of the pendingMessages end CancelMessage @''uHilitefalseClick here to start+Q cREVGeneral scriptChecksumlyxȸE breakPoints handlerList?mouseUp mouseDown mouseRelease uHilite mouseEnter CancelMessagescriptSelectionchar 1430 to 1429 revUniqueID 1121507236759 bookmarks tempScript prevHandlermouseUpscript"m

-- To set the multiple icons for this button

-- its autoHilite property has been set to false

-- and different status are coded

-- Here I use a custom property and take benefit of a setProp structure

-- very handy!

on mouseUp

set the uHilite of me to false

CancelMessage -- 

-- see below

lock screen

if not the paused of player (the uPlayer of the owner of me) then

stop player (the uPlayer of the owner of me)

set the icon of me to the ID of img "PLayNormal.png"

set the icon of btn "BackWard" to the ID of img "BackWardDisabled.png"

set the icon of btn "ForWard" to the ID of img "ForWardDisabled.png"

else

set the endValue of scrollBar "MusicProgress" to the duration of player (the uPlayer of the owner of me)

set the playRate of player (the uPlayer of the owner of me) to 1

start player (the uPlayer of the owner of me)

ShowMusicProgress (the uPlayer of the owner of me),"MusicProgress","ElapsedTime" -- G

-- this important handler which monitors music progress is in the group's script

if there is a btn "Loop" then set the looping of Player (the uPlayer of the owner of me) to the hilite of btn "Loop"

set the icon of me to the ID of img "PauseNormal.png"

set the icon of btn "BackWard" to the ID of img "BackWardNormal.png"

set the icon of btn "ForWard" to the ID of img "ForWardNormal.png"

end if

unlock screen

mouseEnter -- to refresh the tooltip

end mouseUp

-----------------------

on mouseDown

set the uHilite of me to true

end mouseDown

-----------------------------

on mouseRelease

set the uHilite of me to false

end mouseRelease

-----------------------

setProp uHilite pFlag

if pFlag then

if the icon of me = the ID of img "PlayNormal.png" then set the icon of me to the ID of img "PlayHilited.png"

else set the icon of me to the ID of img "PauseHilited.png"

else

if the mouseLoc is within the rect of the target then

if the icon of me = the ID of img "PlayHilited.png" then set the icon of me to the ID of img "PauseNormal.png"

else set the icon of me to the ID of img "PlayNormal.png"

else

if the icon of me = the ID of img "PlayHilited.png" then set the icon of me to the ID of img "PlayNormal.png"

else set the icon of me to the ID of img "PauseNormal.png"

end if

end if

mouseEnter -- 

pass uHilite

end uHilite

-----------------------------

on mouseEnter

set the tooltip of me to empty

if not the paused of player (the uPlayer of the owner of me) then set the tooltip of me to "Click here to pause"

else set the tooltip of me to "Click here to start"

end mouseEnter

-----------------------------

on CancelMessage

local tLineNo

-----

put lineOffset("ShowMusicProgress",the pendingMessages) into tLineNo

if tLineNo <> 0 then cancel item 1 of line tLineNo of the pendingMessages

end CancelMessage

FForwardjC -- To set the icons for this button -- its autoHilite property has been set to false -- and different status are coded -- Here we use a custom property and take benefit of a setProp structure -- In addition, note that the name of the player we want to monitor is stored -- in a custom property (uPlayer) of the commands group -- the code tests if some objects which are not owned by the commands group do exist and act accordingly on mouseEnter set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me)) -- G -- see this function in group's script if the icon of me = the ID of img "ForwardDisabled.png" then set the tooltip of me to empty else set the tooltip of me to "Increase forward speed with the option key" end mouseEnter -------------------------------------- on mouseUp if the paused of player (the uPlayer of the owner of me) then exit mouseUp set the uHilite of me to false set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me) set the playRate of player (the uPlayer of the owner of me) to 1 -- following line must be adpated if you copy the group into your own project if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me) end mouseUp -------------------------------------- on mouseDown if the paused of player (the uPlayer of the owner of me) then exit mouseDown set the uHilite of me to true if the playLoudness of player (the uPlayer of the owner of me) > 20 then if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to 20 set the playLoudness of player (the uPlayer of the owner of me) to 20 end if end mouseDown -------------------------------------- ## allow to monitor the play rate on mouseWithin if the mouse is up or the paused of player (the uPlayer of the owner of me) then exit mouseWithin if the optionKey is down then set the playRate of player (the uPlayer of the owner of me) to 10 else set the playRate of player (the uPlayer of the owner of me) to 3 end mouseWithin -------------------------------------- on mouseRelease if the paused of player (the uPlayer of the owner of me) then exit mouseRelease set the uHilite of me to false set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me) set the playRate of player (the uPlayer of the owner of me) to 1 -- following line must be adpated if you copy the group into your own project if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me) end mouseRelease -------------------------------------- setProp uHilite pFlag if pFlag then set the icon of me to the ID of img "ForwardHilited.png" else set the icon of me to the ID of img "ForwardNormal.png" pass uHilite end uHilite @ uHilitefalse+L cREVGeneralscriptChecksum3o|- bookmarks revUniqueID 1121507236784 handlerList=mouseEnter mouseUp mouseDown mouseWithin mouseRelease uHilitescriptSelectionchar 818 to 817 prevHandler mouseWithin tempScriptscript#B

-- To set the icons for this button

-- its autoHilite property has been set to false

-- and different status are coded

-- Here we use a custom property and take benefit of a setProp structure

-- In addition, note that the name of the player we want to monitor is stored

-- in a custom property (uPlayer) of the commands group

-- the code tests if some objects which are not owned by the commands group do exist and act accordingly

on mouseEnter

set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me)) -- G

-- see this function in group's script

if the icon of me = the ID of img "ForwardDisabled.png" then set the tooltip of me to empty

else set the tooltip of me to "Increase forward speed with the option key"

end mouseEnter

--------------------------------------

on mouseUp

if the paused of player (the uPlayer of the owner of me) then exit mouseUp

set the uHilite of me to false

set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me)

set the playRate of player (the uPlayer of the owner of me) to 1

-- following line must be adpated if you copy the group into your own project

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me)

end mouseUp

--------------------------------------

on mouseDown

if the paused of player (the uPlayer of the owner of me) then exit mouseDown

set the uHilite of me to true

if the playLoudness of player (the uPlayer of the owner of me) > 20 then

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to 20

set the playLoudness of player (the uPlayer of the owner of me) to 20

end if

end mouseDown

--------------------------------------

## allow to monitor the play rate

on mouseWithin

if the mouse is up or the paused of player (the uPlayer of the owner of me) then exit mouseWithin

if the optionKey is down then set the playRate of player (the uPlayer of the owner of me) to 10

else set the playRate of player (the uPlayer of the owner of me) to 3

end mouseWithin

--------------------------------------

on mouseRelease

if the paused of player (the uPlayer of the owner of me) then exit mouseRelease

set the uHilite of me to false

set the playLoudness of player (the uPlayer of the owner of me) to the uCurLoudness of player (the uPlayer of the owner of me)

set the playRate of player (the uPlayer of the owner of me) to 1

-- following line must be adpated if you copy the group into your own project

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me)

end mouseRelease

--------------------------------------

setProp uHilite pFlag

if pFlag then set the icon of me to the ID of img "ForwardHilited.png"

else set the icon of me to the ID of img "ForwardNormal.png"

pass uHilite

end uHilite

I ElapsedTimeon mouseEnter if target = empty then set the tooltip of me to empty else set the tooltip of me to "Elapsed time" end mouseEnter @kI Elapsed time cREVGeneralscriptChecksumѼ {]y72 WRY bookmarks revUniqueID 1121669642712 handlerList mouseEnterscriptSelectionchar 132 to 131 prevHandler tempScriptscript

on mouseEnter

if target = empty then set the tooltip of me to empty

else set the tooltip of me to "Elapsed time"

end mouseEnter

 MusicProgressyq yon mouseEnter set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me)) -- see this function below if not the paused of player "Test" then set the cursor to 3258 -- this is a Rev built-in cursor imported into the stack lock cursor set the tooltip of me to "Click in this interactive progress bar to move through the music" else set the tooltip of me to empty end mouseEnter -------------------------------------- on mouseDown if not the paused of player "Test" then set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me)) -- see this function below if the playloudness of player "Test" > 20 then if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to 20 set the playloudness of player "Test" to 20 end if end if end mouseDown -------------------------------------- on mouseMove if (not the paused of player "Test") and the mouse is down then set the currentTime of player "Test" to round(the duration of player "Test" * (item 1 of the mouseLoc - the left of me)/(the width of me)) end if end mouseMove -------------------------------------- on mouseLeave unlock cursor if not the paused of player "Test" then ResetLoudness -- end mouseLeave -------------------------------------- on mouseUp if not the paused of player "Test" then ResetLoudness -- end mouseUp -------------------------------------- on mouseRelease if not the paused of player "Test" then ResetLoudness -- end mouseRelease -------------------------------------- on ResetLoudness set the playloudness of player "Test" to the uCurLoudness of player (the uPlayer of the owner of me) if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me) end ResetLoudness -------------------------------------- function MyRound pNumber -- this function is used since there is a weird behaviour when there are multiple calls to the feature -- and we want the playLoudness to be a multiple of 10 switch case char -1 of pNumber = 0 return pNumber case char -1 of pNumber < 5 put 0 into char -1 of pNumber break default add 1 to char 1 of pNumber put 0 into char -1 of pNumber end switch return pNumber end MyRound 12384 cREVGeneral scriptChecksumucFs&+Q+ handlerListTmouseEnter mouseDown mouseMove mouseLeave mouseUp mouseRelease ResetLoudness MyRound breakPointsscriptSelectionchar 287 to 286 revUniqueID 1121670777155 bookmarks tempScript prevHandler mouseDownscript

on mouseEnter

set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me))

-- see this function below

if not the paused of player "Test" then

set the cursor to 3258

-- this is a Rev built-in cursor imported into the stack

lock cursor

set the tooltip of me to "Click in this interactive progress bar to move through the music"

else set the tooltip of me to empty

end mouseEnter

--------------------------------------

on mouseDown

if not the paused of player "Test" then

set the uCurLoudness of player (the uPlayer of the owner of me) to MyRound(the playloudness of player (the uPlayer of the owner of me))

-- see this function below

if the playloudness of player "Test" > 20 then

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to 20

set the playloudness of player "Test" to 20

end if

end if

end mouseDown

--------------------------------------

on mouseMove

if (not the paused of player "Test") and the mouse is down then

set the currentTime of player "Test" to round(the duration of player "Test" * (item 1 of the mouseLoc - the left of me)/(the width of me))

end if

end mouseMove

--------------------------------------

on mouseLeave

unlock cursor

if not the paused of player "Test" then ResetLoudness -- 

end mouseLeave

--------------------------------------

on mouseUp

if not the paused of player "Test" then ResetLoudness -- 

end mouseUp

--------------------------------------

on mouseRelease

if not the paused of player "Test" then ResetLoudness -- 

end mouseRelease

--------------------------------------

on ResetLoudness

set the playloudness of player "Test" to the uCurLoudness of player (the uPlayer of the owner of me)

if there is a sb "Loudness" then set the thumbPos of sb "Loudness" to the uCurLoudness of player (the uPlayer of the owner of me)

end ResetLoudness

--------------------------------------

function MyRound pNumber

-- this function is used since there is a weird behaviour when there are multiple calls to the feature

-- and we want the playLoudness to be a multiple of 10

switch

case char -1 of pNumber = 0

return pNumber

case char -1 of pNumber < 5

put 0 into char -1 of pNumber

break

default

add 1 to char 1 of pNumber

put 0 into char -1 of pNumber

end switch

return pNumber

end MyRound

NRemainingTimeon mouseEnter if target = empty then set the tooltip of me to empty else set the tooltip of me to "Remaining time" end mouseEnter @.IRemaining time cREVGeneralscriptChecksumDh"B&ݞ=C bookmarks revUniqueID 1121671096440 handlerList mouseEnterscriptSelectionchar 113 to 112 prevHandler tempScriptscript

on mouseEnter

if target = empty then set the tooltip of me to empty

else set the tooltip of me to "Remaining time"

end mouseEnter

 Test` uCurLoudness100  cREVGeneralscriptChecksumُ B~ revUniqueID 1121780504219 bookmarks handlerList tempScript prevHandler playStoppedscriptSelection char 1 to 0script

+IBackwardDisabled.png @"PNG  IHDR9 pHYs  gAMA|Q cHRMz%u0`:o_FIDATxڌɹ @ Au8_wLTվ1333DfU%wl 0 C#xh'L:vsKeG8e+{]W*"PU,)5gOA80 /$n<ُ/[xc̾ת69##\PkE)"Ōa[{t Ea90˗`K555#BǏ ׯ_cPT3D.b\bܷ /o92 اPH9sΝ dyrbY >嫗 F 66@ p"c $ A$DL`oooÇ3\x $_HHF` (( -,`V!\.SƄPfB̹p(11 oa92$*fW0 "0#e `gOb >~473KL`o1A:q0 !KP5u z:: ?~dxLO B @q--MpdDeps€:m&Qo^=@LWkttt@%,g3Ah&&8gS @@LʛrdgO28q*q PG<} Ts 7o011 0  X'p! fY&?y .?~ IL Ar05 YQQ PÎ`yPt ;+ϟ?3HHJ}B } q $;>z1q+Pw/_21cJ` ,,p5P XXX ,$9Da0<(@r>dxĠ, ~X԰0< R01Tt VA5777?~pq#?N:pY@7?hpyB .AE-@K8"PPq F9yy=zp}pya5 ʂ'Tx@5򐍍@A<<<LҐã%Xʳ SPɠR T Jcx+`*aM\1oM%^ۡW Irў?]D c'^24fԌb0rBhs)x _r1q1Gcai0 ANfafE0~OAiLF#Bo&Hf{c7@|QZJ?(Z$<Ƃ_L(UPRbPbdbB$* PPQR?:X X~ {I`a8 8> dyT ul~[6 ߿g p 1x"*8*䔊00ۇËn-700 { }e/ f8 ~FPdc+ l6\ R"恢{~d9@1oQOOhܿ{/t[_٘ u\ TŁly- 2oF8YZZ] r4[3! JqX} Ō @-8[[[3;~ muR9x 03 /^o#` ji .###p @z9K.*Fx{JU"$$_RR ˗/ bpcSP=@ggR`D@1\g_ 0%2h#p J GD.jIKˀYNPG#zw իCA%`cPAY.c5J@ Ę `ޤZ DJIENDB` cREVGeneral revUniqueID 1121784593771K ScriptChoice uon menuPick pItem local tLabel ----- switch pItem case "Export Scripted Group" put "Copy Group" into tLabel break default put "Show Script" into tLabel end switch set the label of btn "Action" to tLabel end menuPick UChecking QuickTime Version]Checking QuickTime Version - Calculating Duration Calculating Elapsed Time Calculating Remaining Time - Play/Pause function Tracking the Player Forward Quick Search Backward Quick Search Setting the Loudness Looping Keyboard Shortcuts Sound File in a Custom Property - Initializing the API Enabling the API Disabling the API - Export Scripted Group cREVGeneralscriptChecksumT`Z#/ {{ bookmarks revUniqueID 1121516350069 handlerListmenuPickscriptSelection char 86 to 85 prevHandlermenuPick tempScriptscriptE

on menuPick pItem

local tLabel

-----

switch pItem

case "Export Scripted Group"

put "Copy Group" into tLabel

break

default

put "Show Script" into tLabel

end switch

set the label of btn "Action" to tLabel

end menuPick

MLoophE-- This button does not need any scripting -- the checkBox status is automatically checked by the main pending message -- just needs to be named "Loop" -- see the discussion about setting the looping property of a player by script ~o> cREVGeneralscriptChecksum,:$iDw4J revUniqueID 1121672125478 bookmarks handlerList tempScript prevHandlermouseUpscriptSelectionchar 210 to 209script

-- This button does not need any scripting

-- the checkBox status is automatically checked by the main pending message

-- just needs to be named "Loop"

-- see the discussion about setting the looping property of a player by script

Check QuickTime VersionEpRon mouseUp CheckForQT -- C -- see this handler in card's script end mouseUp +Click here to check your QuickTime version cREVGeneral scriptChecksum}V{fq4 handlerListmouseUp breakPointsscriptSelection char 12 to 11 bookmarks revUniqueID 1121780924471 prevHandlermouseUp tempScriptscript

on mouseUp

CheckForQT -- C

-- see this handler in card's script

end mouseUp

 Discussiona(< cREVGeneral revUniqueID 1120920450292  Discussion)p"on linkClicked pLink set the linkText of the clickChunk to empty switch pLink case "sosmartsoftware.com" revGoUrl "http://www.sosmartsoftware.com" break case "Ken Ray tips and tricks" revGoUrl "http://www.sonsothunder.com/index2.htm?http://www.sonsothunder.com/devres/revolution/revolution.htm" break case "http://www.apple.com/quicktime/" revGoUrl pLink break default lock screen repeat 2 find string pLink in target end repeat find empty unlock screen end switch end linkClicked @,@ cREVGeneral scriptChecksumfѤug[- handlerList linkClicked breakPointsscriptSelectionchar 545 to 544 bookmarks revUniqueID 1120920444330 prevHandler linkClicked tempScriptscript

on linkClicked pLink

set the linkText of the clickChunk to empty

switch pLink

case "sosmartsoftware.com"

revGoUrl "http://www.sosmartsoftware.com"

break

case "Ken Ray tips and tricks"

revGoUrl "http://www.sonsothunder.com/index2.htm?http://www.sonsothunder.com/devres/revolution/revolution.htm"

break

case "http://www.apple.com/quicktime/"

revGoUrl pLink

break

default

lock screen

repeat 2

find string pLink in target

end repeat

find empty

unlock screen

end switch

end linkClicked

 #How-To Stack #019 by Eric Chatonet @" @ 7/29/05 Initial release @ This stack shows you how to monitor a QuickTime player to play music and provide all the usual commands, and more, to the user. @ The main commands and a player are embedded in a scripted group, which you can export into any project. This scripted group is able to monitor, not only sound files, but also the video files as well. :-) @ >Heartfelt thanks to Jim Bufalini for editing this discussion. @= Enjoy! @ Summary: @ / Simple play command versus QuickTime support @1600   , $ Introduction to QuickTime players @1600   ! ! Checking the QuickTime version @1600    / Specifying the file associated with a player @1600   ,  The playing interface @1600     Initializing the API @1600     The Play/Pause function @1600     Tracking the player status @1600     Backward and forward search @1600     Setting the loudness @1600     Allowing looping @1600    " Implementing keyboard shortcuts @1600    . Exporting the interface in your own project @1600   +  API commands @1600    % Using the interface to play movies @1600   " 5 Bonus 1: Storing a music file in a custom property @1600   2  Bonus 2: Managing playlists @1600    Vocabulary @1600     -Simple play command versus QuickTime support ,  x Revolution provides the play command to play music files or clips that are stored in a stack, or in an external file: @1600   Y ?play [filePath | type] [looping] [at point] [options xOptions] jThe play command is mainly to play aiff and vaw files (avi, m4a, mov, mp3 files, etc. are not supported).   a IOn the other hand, QuickTime supports all these types of files and more. [Thus, you might prefer using QuickTime for playing music, as it has three main advantages: ? 1. You can use mp3 files, which are dramatically smaller than  =  aiff or vaw files.   6 2. QuickTime is cross-platform (Windows and Mac OS).  4 @ 3. Revolution has a variety of functions and excellent support  >  for controlling QuickTime.   Note: QuickTime is *always* available on Macs, as it comes pre-installed., However, it may not be installed on your user's Win machines, so you will have to test for its existence and, if not found, ask the user to install it themselves from the following download URL:   http://www.apple.com/quicktime/   "Introduction to QuickTime players !  6 Starting and stopping a player, by script, is easy: @1600 4  start player 1 @   stop player 1 @  * But, there is more to it than this. :-) @1600 ( For example, you may want to: * 1. Check for the existence of QuickTime.  ( " 2. Provide a complete interface.    3. Track the player's status.    4. Take appropriate action.    5. Display information.    6. Allow keyboard shortcuts.   = 7. Add a progress bar, a loudness slider, or other control.  ; etc., etc.   1All of this can result in a lot of scripting... This tutorial explores most aspects of building a complete graphic interface, along with an API that allows the user to control playing music through a QuickTime player. Checking the QuickTime version:   4 QuickTime must be installed for a player to work. @1600 2 In order to check if QuickTime is installed on the current system, Revolution provides the QTVersion function which returns the version installed. @1600 D E ] f glossary/return.xmlw } V In order to play mp3 files, the minimum versions, by platform, are the following: @1600 B C Mac OS X QuickTime 6.4.0   Mac OS 9 QuickTime 6.0.3   Win 32 QuickTime 6.4.0   Linux N/A    U The main sound file types QuickTime recognizes, with these versions installed are: @1600 < = /aiff Can be played by the play command also  * .vaw Can be played by the play command also  * )m4a Can't be played by the play command  % )mp3 Can't be played by the play command  % avi Movie sound track   mov Movie sound track   You will find a CheckForQT handler (accessible by the option menu at the bottom of the Action pane) which takes everything into account to alert the user if necessary. @1600    -Specifying the file associated with a player , S Players use external files only, and can't play sound files embedded in stacks. @1600 > ? That's a good thing, since any stack is fully loaded in memory. So if you embed 100 MB sounds in a stack, this stack will need at least a block of 100 MB RAM to run...  ~ Note that a bug affects the property palette when assigning a file to a player: only mov files appear in the choice dialog. @1600 D E8 1Assigning a player by script, is not a problem: $ answer file "Choose an mp3 file:" @   if it <> empty then @  @ 1 set the filename of player "My Player" to it @  @  end if @  @ There are so many file types supported by QuickTime (the list increases with each new version) that it's not a good idea to attempt to filter the choice dialog. Rather, test the file validity, after having set the fileName of the player. @1600 ? @ 9 A good trick is to test the playerstimeScale property: @1600 $ % . 2 if the timeScale of player "My Player" = 0 then @ @  @  @- 4 set the fileName of player "My Player" to empty @ @  @  & answer error "File not supported"  @  end if @ When the player timeScale property is zero, it means that the file is an empty file, or QuickTime was not able to calculate its duration. In either case, you will not be able to play this file...    The playing interface  A good playing interface is where the QT player interface is not be seen by the user, but all of the QT features are made available to the user. These are: @1600 E FW  1. Play/Pause    2. Progress visualization   & 3. Forward and backward quick search  !  4. Loudness settings   K 5. Keyboard shortcuts (space bar to play/pause and return to begin again)   4  This tutorial adds: @1600   1. Elapsed time indication    2. Remaining time indication    3. Looping ability    In addition : @1600  6 1. Forward and backward quick search (with 2 speeds)  ! % = To build this interface, you will need about 20 controls. @1600 ; These are: 5 1. Three buttons (Play/pause, backward and forward) 2 2. Two scroll bars (1 slider and 1 progress bar)  3. One check box (looping) 2 4. Two label fields (elapsed and remaining time) d 5. Twelve icons: backward, forward, play and pause, in three states (normal, hilited and disabled) E E   And... One QT player object. @1600  LThe above set of controls is all you need to totally control the QT player. KAs I said, it may not be quick and easy, but it's definitely worth it. :-) J In this tutorial, all the main controls (in bolded style in the list above) are embedded in a group. This is so you can copy this group to one of your projects, and use it immediately (see below). @1600 . / ; NSee the Export Main Commands menu item in the option menu of the Action pane. @M  Initializing the API   INote: All code below is provided as a ready to use API in this tutorial. -It is here, only for your comprehension :-) See the APICommandsbelow. To initialize the API, the player file name, the progress bar values, the right button icon and the time elapsed and remaining indicators need to be set: @1600 G HT on InitializeAPI pFileName @  -- Player: @hh"" 8 set the fileName of player to pFileName  @  @  %  -- Progress bar: @hh"" D set the endValue of scrollBar to the duration \  @  @  & @9 A  of player 6 set the thumbPos of scrollBar to 0  @  @  #  -- Button icons: @hh"" * set the icon of btn "PlayPause" to  @  @   @& ( ) set the icon of btn "BackWard" to  @  @   @% ' ( set the icon of btn "ForWard" to  @  @   @$ &  -- Time indicators: @hh"" 8 put ElapsedTime() into fld "ElapsedTime"  @  @  @  < put RemainingTime() into fld "RemainingTime"  @  @  @! " end InitializeAPI @  } When you set the fileName of a player, it's stops and returns to the beginning (currentTime = 0) and then ready to start. @1600   8 S ^ The progress scrollbar endvalue is set to the player's duration and its thumbPosition to 0 (at the bar beginning). Later the currentTime property will allow you to set the thumbPosition easily. @1600   ! 9 A J W(  $   8 The button icons indicate that the player is stopped. @1600 6 D Time indications use two functions which return the right values: @1600 B !function ElapsedTime pPlayerName @  2 if the timeScale of player pPlayerName = 0 then  @  @  @-  return "Non available" @  end if  @  @ 7 return ConvertTime(round(the currenttime of player \  @  @  @ * = pPlayerName/the timeScale of player pPlayerName)) --  @  @  @5 7 @hh""8 end ElapsedTime @  Note that elapsed time is calculated from the currentTime (the elapsed time) and converted to seconds with the help of the timeScale (the number of intervals per second). @1600 / 0 ;B } % #function RemainingTime pPlayerName @  2 if the timeScale of player pPlayerName = 0 then  @  @  @-  return "Non available" @  end if  @  @ A return ConvertTime(round(the duration of player pPlayerName/ \  @  @  @ ' @= > E the timeScale of player pPlayerName) - round(the currenttime \ @  @) * @- @2 6 @7 B B of player pPlayerName/the timeScale of player pPlayerName))  @  @ ) @? end RemainingTime @  RemainingTime is a variation of the first function. It returns the difference between the total duration and the current position. @1600 D E? U For both, pPlayerName is a parameter which specifies the short name of the player. @1600 @ A X An additional ConvertTime function converts the result in hours, minutes and seconds: @1600 B C function ConvertTime pSeconds @  ! local tSeconds,tHours,tMinutes  @   -----  @hh"" $ put pSeconds div 3600 into tHours  @  & put pSeconds mod 3600 into pSeconds  @  $ put pSeconds div 60 into tMinutes  @  $ put pSeconds mod 60 into tSeconds  @   -----  @hh"" . if tSeconds < 10 then put 0 before tSeconds  @  @  @  . if tMinutes < 10 then put 0 before tMinutes  @  @  @   -----  @hh""  if tHours <> 0 then  @  @ 8 return tHours & colon & tMinutes & colon & tSeconds @ - * else return tMinutes & colon & tSeconds @  @  end ConvertTime @   This function is very useful for a variety of reasons. It primarily uses two numeric operators: div which divides one number by another and returns the integer part of the result and mod which evaluates to the remainder leftover, when one number is divided by another. @1600 E F c f* glossary/return.xml  dictionary/integer_keyword.xml    glossary/remainder.xml 1 The Play/Pause function  9The main button allows switching between play and pause. m Here icon management is a bit more complicated as the button uses four icons (disabled ones not included). @1600 > ?- You can't just leave its autoHilite property to true and specify some icons IDs in the Icons and Border pane of the properties inspector...     #4 W g$ !You have to script this feature: This is because the built-in autoHilite property is not used. It is replaced here with a custom property (uHilite) and it's a setProp control structure, which elegantly allows you to do the job.   'W ~ > All references to icons IDs are made in a special form by using the ID of img . This form allows you to copy the main commands group to another project without loosing the references (when pasting objects, Rev will assign new IDs to all objects in order to avoid conflicts). @ @ @D F Z T As for starting and pausing the player, as I said it above, it's a piece of cake: @1600 D E start player @  stop player @  ]In fact, the main task, detailed below, is to track the player's status and act accordingly. Tracking the player status  KTo update the interface, you always have to be aware of what is happening.  The best way to do this is to use a pending message. This is a message scheduled to be sent repeatedly every x milliseconds: @1600 @ A= local lCancelID @  ----- @hh"" on MyRepeatedlySentMessage @    @ ; send "MyRepeatedlySentMessage" to me in 100 milliseconds @ @  @$ ' @. put the result into lCancelID @  @   end MyRepeatedlySentMessage @  ----- @hh"" on CancelMyMessage @   cancel lCancelID  @ end CancelMyMessage @  BRev will automatically manage this handler, until you cancel it. i You declare a script local variable (lCancelID), outside the handlers, to make it globally available. @1600 ? @( Each time the message is sent, Rev assigns an ID to it, which is returned by the result function and stored in the LcancelID variable. @1600 B CE z When you want to cancel the message, you just use the cancel command followed by the message ID stored in the variable. @1600 7 8 >; u As for the , you only have to check the player paused property and refresh the interface accordingly: @1600 = > D0 on ShowMusicProgress @  ? if the paused of player and (the currentTime \  @  @   @- 0 @1 < G of player = the duration of player \ $ @$ , ; or the currentTime of player = 0) then @  @4 5 @6  lock screen  @   -- refreshing icons:  @hh"" , set the icon of btn "PlayPause" to  @  @   @( * + set the icon of btn "BackWard" to  @  @   @' ) * set the icon of btn "ForWard" to  @  @   @& ( -- refreshing progress bar:  @hh"" 1 set the thumbPos of sb to 0  @  @   $ -- refreshing time indications:  @hh"" & put empty into fld "ElapsedTime" @  ' put empty into fld "RemainingTime" @   unlock screen  @   exit ShowMusicProgress  @  3 -- we do not need this pending message any more @hh""2  else @hh"" @  lock screen @ @ @  -- refreshing progress bar:  @hh"" 5 set the thumbPos of scrollBar \ @  @   3 to the currentTime of player pPlayerName  @  $ -- refreshing time indications:  @hh"" > put RemainingTime() into fld "RemainingTime" @  @  @# $ : put ElapsedTime() into fld "ElapsedTime" @  @  @! "  unlock screen @  # -- we send this message again:  @hh"" > if "ShowMusicProgress" is not in the pendingMessages then  @ # @) 8 @9 ( send "ShowMusicProgress" to me in \ @  @  " 5 ((1 - (the long seconds mod 1)) / 5) seconds  @  @  @- end if  @  @ end ShowMusicProgress @  wThis handler uses a conditional structure which tests if the player is paused at its beginning/end or if it's running. N When the user starts to play, this handler is automatically sent a message. @1600 D E If the user pauses, this handler refreshes the interface accordingly and stops (exit ShowMusicProgress). So the pending message is only used when necessary. @1600 F G @R V h6 q The message is regularly sent every 200 milliseconds. This allows you to get precise change time indications . @1600 C D, The form if "ShowMusicProgress" is not in the pendingMessages then prevents accidently sending more than one pending message at a time. @1600  @   # @0 ? @@ DE @ Refreshing icons is not necessary when the player is running. @1600 > Backward and forward search  By default, the playRate property of a player, which specifies how fast the player plays and, if the sound is played forward or backward, is set to 1 (forward normal speed).    k A playRate greater than 1 speeds up the playback, and a playRate of less than 1 slows down the playback. @1600    . : B( a A positive playRate plays the sound forward, and a negative playRate plays the sound backward. @1600    ) > F So, to implement a forward search, you would use a positive playRate greater than 1 and for a backward search, a negative playRate greater than 1. < < D6 z  GNow, let us study the main features of a basic backward button script: on mouseUp @  0 set the playRate of player to 1 @  @  end mouseUp @  ------------ @hh"" on mouseWithin @  @ if the mouse is up or the paused of player then  @  @   @ # @;  exit mouseWithin @ end if  @ 2 set the playRate of player to - 3 @ @  @  end mouseWithin @  ------------ @hh"" on mouseRelease @  0 set the playRate of player to 1 @  @  end mouseRelease @  All of this is accomplished with the mouseWithin handler (by default, this message is sent repeatedly by the engine every 200 milliseconds) @1600 & ' 2[ You will find the code in this stack a bit more complicated, since it manages the button icon changes, offers two possible searching speeds, and turns down the volume when searching (which is much more pleasant to the ear :-) @1600 > ? Setting the loudness   ~The playLoudness property may be set globally (to apply to all sounds in Revolution) or "local" (just the specified object):   m 'set the playLoudness to 80 -- globally @  @  @hh"" Bset the playLoudness of player to 30 -- this player @  @  @ + @, - =The playLoudness may vary between 0 (silence) and 100 (max). IIn this tutorial, we use a slider to allow you to set the player volume: on mouseUp @  # put the thumbPos of me into tPos  @  @   @  switch  @  case char -1 of tPos < 5 @ @  @    put 0 into char -1 of tPos  @  @  break  @ default @ @  add 1 to char 1 of tPos @ @   put 0 into char -1 of tPos  @  @  end switch @ @ @ ! set the thumbPos of me to tPos  @  @   @   -----  @hh"" 7 set the playLoudness of player to tPos  @  @  end mouseUp @  --------------------------- @hh"" on scrollBarDrag pPos @  7 set the playLoudness of player to pPos  @  @  end scrollBarDrag @  D The form used in this mouseUp handler changes in multiples of 10. @1600   $ Note that this feature is not included in the main commands group. If you want this feature, you have to implement it yourself.  jIf you create a slider scrollbar named "Loudness", the code in the main commands group will recognize it. i Allowing looping  mThe looping property of a player specifies whether a sound stops at the end, or restarts from the beginning.    a (So in a checkbox script, you can write: to the hilite of me @  @  @/ 5 @9 In the scripted group, The check box status is automatically checked when necessary. So this button has not any code in its script :-) Implementing keyboard shortcuts  IAccordingly to habits, 2 main keyboard shortcuts have to be implemented. ( Play/Pause by pressing the space bar: @1600 & on keyDown pKey @  8 if charToNum(pKey) = 32 then -- ASCII code for space @ @ @  @ @hh"" & send "mouseUp" to btn "PlayPause" @ @hh"" @hh""  @hh""  @hh""   else pass keyDown @ @  end keyDown @  : Restart from the beginning, by pressing the return key: @1600 8 on returnKey @  3 set the currentTime of player to 0  @  @  / set the thumbPos of sb to 0  @  @  end returnKey @  5 We add another keyboard shortcut to the main loop: @1600 3 on commandKeyDown pKey @  5 if charToNum(pKey) = 108 then -- ASCII code for l @ @hh"" @ @ @hh""  @hh""  @ @hh""  3 A set the hilite of btn "Loop" to not the hilite of btn "Loop" @hh"" @  @   @, 2  else pass commandKeyDown @hh"" @ @hh"" @ @hh""   end commandKeyDown @  ,Exporting the interface in your own project + The last item in the previous pane option menu allowed you to install the playing interface into your own project, with a single mouse click. 8This has been designed make it easy for you to do this. Some important notes:  Keyboard shortcuts are not exported by this process, since keyboard events are not sent to a group. The corresponding handlers (keyDown, returnKey and commandKeyDown in the stack's script of this stack) have to be installed manually in your card or stack script. @1600 < = The Loudness features are not exported either, but if you script a slider named "Loudness" (or copy the one provided), it will be recognized by the scripted group, and will be used when making a speed search. @1600 D E  The Looping feature is not exported either, but if you add a checkbox named "Loop" (set its label to whatever you want) even with an empty script, it will be recognized by the scripted group, and the group will act in accordance to the highlight of the check box. @1600 > ? API commands  To initialize the commands and the player (provided by the scripted group or your own: see above), use the following line of code: @1600  & +Y ? send "InitializeAPI" && to grp "PlayGroup" @ 8 qThe InitializeAPI handler requires only one parameter: the sound file path. For example, put in a button script:   _ on mouseUp @  % answer file "Choose a Music File:"  if it <> empty then @  @ 2 send "InitializeAPI" && it to grp "PlayGroup" @ ) end if @ end mouseUp @  The InitializeAPI handler will take care of all initialization like checking if it's a file supported by the current version of QuickTime and will behave accordingly.    ; To disable all commands, use the following line of code: @1600   ! ' send "DisableAPI" to grp "PlayGroup" @  6 To enable commands, use the following line of code: @1600   ! & send "EnableAPI" to grp "PlayGroup" @  #Using the interface to play movies " 7The provided interface may be used to play movies too! 6 Since the player embedded in the group is hidden, just create your own *visible* player and specify which player the API has to monitor: @1600 E FE By default, the API monitors the player it owns (which is named "Test") but you can change this by setting the uPlayer custom property of the group "PlayGroup" to the name of another player: o o vH 5 set the uPlayer of grp "PlayGroup" to @ . Then play movies :-) 3Bonus 1: Storing a music file in a custom property 2 uWe have seen that you can't play a stored sound in a stack through a player, since players play external files only. Nevertheless, there's nothing to stop you from putting a file into a custom property, then creating the corresponding file on the hard drive "on-the-fly" at runtime and playing it. )1. To store a file in a custom property: % answer file "Choose a Music File:"  @   if it <> empty then @  @ @ set the of to url("binfile:" & it)  @ & @. 8 @> ; -- set the uMusic of this card to url("binfile:" & it) @hh"": end if @ ?Sound files are binary data: you have to use the binfile form. 1 1 8 And take care of the file size! 22. To create a sound file from a custom property: ,on CreateSoundFileFromCustomProp pMusicData @ ) ? -- pMusicData parameter is the contents of a custom property @hh""> $ -- where the sound file is stored @hh""#   local tFileType  @  @  -----  @hh"" 8 put specialFolderPath("temp") & slash & \ @hh"" @ 1  into tMusicFilePath * if there is no file tMusicFilePath then @  @% B put the fileType into tFileType -- store the current fileType @  @   @hh""$ . set the fileType to "TVODMp3 " -- for mp3 @  @   @hh""# 9 put pMusicData into url("binfile:" & tMusicFilePath) @  @ % @7 6 -- note that using binfile is here compulsory too @ @hh""1 " set the fileType to tFileType @  @    -- restore the fileType @hh"" end if  @  @ 7 set the fileName of player to tMusicFilePath @ @  @  @ % "end CreateSoundFileFromCustomProp @  b The above handler is a Mac OS example, which creates the file in the user's temporary folder. @1600 D E + For Win 32 you would use another method. @1600 ) * 5See Ken Ray tips and tricks for further information.     3 You could also build a special path by yourself. For example, this tutorial creates a temporary folder in the main Rev folder. @1600 D E;  %See the script in the previous pane. # # A When you have finished with a file, don't forget to delete it! @1600 ? 8 put specialFolderPath("temp") & slash & \ @ 1  into tMusicFilePath ) if there is a file tMusicFilePath then @ $  delete file tMusicFilePath  @  end if @  @  -- Mac OS only @hh"" If you have created a temporary folder by yourself, you might prefer to use the revDeleteFolder command to delete the folder with all its contents. P P _4 Be careful when using this command: be sure that the folder path is the right one. If not, you can wreak havoc on your hard drive...  Bonus 2: Managing playlists  !Playing a file is the main task. +But you may to do this using playlists :-) This is not difficult. You just have respond to the playStopped message sent by the engine to a player when it stops playing, and then start a new file. @1600 5 6 AY ~ So, assuming that you have a list of music file paths stored in a field named PlayList, you can write in the player script: @1600 C D P X h | on playStopped @   local tPlayList,tFileNo  @  @  ----- @ @hh"" $ put fld "PlayList" into tPlayList  @  < put lineOffset(the fileName of me,tPlayList) into tFileNo  @ @ @ @  @! @# / ) -- the current file number in the list  @hh""& 5 if tFileNo = the number of lines of tPlayList then  @  @  @0  exit playStopped @ - -- the playlist has been entirely played  @hh""(  else  @  -- next file: @hh"" > set the fileName of me to line (tFileNo + 1) of tPlayList @  @  @  @$ + @/ 1  start me @ @   @  end if @  @ end playStopped @  IYou should be able to figure out how to loop the playlist, if needed :-) Vocabulary  eHere are the main dictionary entries you can check in the Revolution documentation about this topic:  Player object @1600   Start command @1600   Stop command @1600   PlayStopped message @1600   PendingMessages function @1600   Paused property @1600   CurrentTime property @1600   Duration property @1600   TimeScale property @1600   FileName property @1600   PlayRate property @1600   PlayLoudness property @1600   `A Print...EpXon mouseUp revPrintField the name of field (the hilitedText of btn tabs) end mouseUp v3R7Click here to print the discussion (about 14 A4 pages) cREVGeometry Master,expectedRect320,586,420,609Master,scalebottomDistanceMaster,movevDistance-26Master,moveVObjectSidebottomMaster,movehDistancefalseMastertrueMaster,scalerightDistanceMaster,moveVObjectRefcardMaster,moveVAbsolutetrueMaster,cardRanking1 Master,moveVtrueMaster,scaleleftDistanceMaster,scaletopDistance cREVGeneralscriptChecksum] 5Xt+( bookmarks revUniqueID 1121517069080 handlerListmouseUpscriptSelection char 91 to 90 prevHandlermouseUp tempScriptscript

on mouseUp

revPrintField the name of field (the hilitedText of btn tabs)

end mouseUp

@ Flche2.png  PNG  IHDR Kpl_ pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?,Xv$ϯ.?~~e'P#@11 @?~23_k_?V@p /÷>|()%ţ,%-F2\@ *n w JU牓/_ o_ū(II` b`AM]Nk5 _ ,?d+@021~K?@fӬ ~W XXY};w<||| ߿}Kw^W@koǑ74;Gڷo_߿uLL7qe`&Fqϟ_sPuFFfbA8`(10r=zk~ TxNP`=l|,IENDB` cREVGeneral revUniqueID 1120971869846PaypalepKon mouseUp revGoUrl UrlDecode(the uPaypalURL of this stack) end mouseUp ,3RCClick here to support development by making a donation with Paypal Donate... cREVGeometry Master,expectedRect320,586,420,609Master,scalebottomDistanceMaster,movevDistance-26Master,moveVObjectSidebottomMaster,movehDistancefalseMastertrueMaster,scalerightDistanceMaster,moveVObjectRefcardMaster,moveVAbsolutetrueMaster,cardRanking1 Master,moveVtrueMaster,scaleleftDistanceMaster,scaletopDistance cREVGeneralscriptChecksum:|vDm8  bookmarks revUniqueID 1121071193478 handlerListmouseUpscriptSelection char 74 to 73 prevHandlermouseUp tempScriptscript

on mouseUp

revGoUrl UrlDecode(the uPaypalURL of this stack)

end mouseUp

 move column DyH11H11 cREVGeneral bookmarks revUniqueID 1129975142904 handlerListscriptSelection char 1 to 0 prevHandler tempScriptscript