www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - time units and types in phobos

reply "Ben Hinkle" <bhinkle mathworks.com> writes:
Reading the doc for std.socker I noticed it defines timeval. Time units and 
data types are typically hard to standardize. Some functions take 
milliseconds, some take micro, some take ints some take longs and some take 
timevals (or timespecs, too?). Remembering which takes what is a pain. What 
do people think of making a std module (or maybe reusing std.date) for 
time-related types and functions? I'm thinking of something along the lines 
of the attached module (modified from my locks library) which is based on 
Java's TimeUnit: 
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/TimeUnit.html

Any objections to writing up some doc and asking Walter to include in 
phobos?

To illustrate the API here are the unittests:

  sleep(2,sec);
  sleep(toTimeval(30,msec));

  assert( toMillis(100,sec) == 100_000 );
  assert( toMicros(100,sec) == 100_000_000 );
  assert( toNanos(100,sec) == 100_000_000_000 );
  assert( toSeconds(100,sec) == 100 );
  assert( convert(100,sec,msec) == 100_000 );
  assert( toMicros(5_000,nsec) == 5 );
  assert( toSeconds(5_000_000,usec) == 5 );
  assert( toSeconds(50,usec) == 0 );
  assert( toNanos(5_000_000_000_000,sec) == long.max );

  timeval tv = toTimeval(100,sec);
  assert( tv.seconds == 100 );
  assert( tv.microseconds == 0 );
  assert( toMillis(tv) == 100_000 );
  assert( toMicros(tv) == 100_000_000 );
  assert( toNanos(tv) == 100_000_000_000 );
  timeval tv2;
  tv2.seconds = 5;
  tv2.microseconds = 7;
  assert( toMicros(tv2) == 5_000_007 );
  assert( toMicros(tv2 + tv) == 105_000_007 );
  assert( toMicros(tv2 - tv) == -94999993 );

-Ben 


begin 666 timeunit.d

M<F]M(&UE;6)E<G, ;V8 2D-0($I34BTQ-C8-"B J($5X<&5R="!'<F]U<"!A
M;F0 <F5L96%S960 =&\ =&AE('!U8FQI8R!D;VUA:6XL(&%S(&5X<&QA:6YE
M9"!A= T*("H :'1T<#HO+V-R96%T:79E8V]M;6]N<RYO<F<O;&EC96YS97,O




M56YI=#PO='0^(')E<')E<V5N=', =&EM92!D=7)A=&EO;G, 870 82!G:79E

M>2!M971H;V1S('1O(&-O;G9E<G0 86-R;W-S('5N:71S+ T*("H 02 \='0^
M5&EM955N:70\+W1T/B!D;V5S(&YO="!M86EN=&%I;B!T:6UE(&EN9F]R;6%T
M:6]N+"!B=70 ;VYL>0T*("H :&5L<', ;W)G86YI>F4 86YD('5S92!T:6UE


M(%1I;655;FET('L-"B  3F%N;U-E8V]N9', /2 P+ T*("!-:6-R;U-E8V]N

M<G1H86YD(&%B8G)E=FEA=&EO;G, 9F]R('1I;64 =6YI=',-"F%L:6%S(%1I
M;655;FET+E-E8V]N9', <V5C.PT*86QI87, 5&EM955N:70N36EL;&E396-O


M=7  =&%B;&4 9F]R(&-O;G9E<G-I;VX 9F%C=&]R<R J+PT*<')I=F%T92!C
M;VYS="!I;G1;5&EM955N:70N;6%X*S%=(&UU;'1I<&QI97)S(#T 6R -"B  


M=7)A=&EO;BX ($YO=&4 =&AA="!B96-A=7-E('=E(&%R90T*("H 9&EV:61I
M;F< =&AE<V4 9&]W;BP =V4 9&]N)W0 :&%V92!T;R!D96%L('=I=&  87-Y

M;VYS="!L;VYG6U1I;655;FET+FUA>"LQ72!O=F5R9FQO=W, /2!;( T*(" P


M"B\J* T*("H 4&5R9F]R;2!C;VYV97)S:6]N(&)A<V5D(&]N(&=I=F5N(&1E
M;'1A(')E<')E<V5N=&EN9R!T:&4-"B J(&1I9F9E<F5N8V4 8F5T=V5E;B!U
M;FET<PT*("H 7'!A<F%M(&1E;'1A('1H92!D:69F97)E;F-E(&EN(&EN9&5X
M('9A;'5E<R!O9B!S;W5R8V4 86YD('1A<F=E="!U;FET<PT*("H 7'!A<F%M
M(&1U<F%T:6]N('1H92!D=7)A=&EO; T*("H 7')E='5R;B!C;VYV97)T960 


M("AD96QT82 ]/2 P*0T*("  (')E='5R;B!D=7)A=&EO;CL-"B  :68 *&1E
M;'1A(#P
M+61E;'1A73L-"B  :68 *&1U<F%T:6]N(#X ;W9E<F9L;W=S6V1E;'1A72D-

M9FQO=W-;9&5L=&%=*0T*("  (')E='5R;B!L;VYG+FUI;CL-"B  <F5T=7)N

M($-O;G9E<G0 =&AE(&=I=F5N('1I;64 9'5R871I;VX :6X =&AE(&=I=F5N
M('5N:70 =&\ =&AI<PT*("H =6YI="X ($-O;G9E<G-I;VYS(&9R;VT 9FEN

M;&]S92!P<F5C:7-I;VXN($9O<B!E>&%M<&QE(&-O;G9E<G1I;F<-"B J(#QT
M=#XY.3D\+W1T/B!M:6QL:7-E8V]N9', =&\ <V5C;VYD<R!R97-U;'1S(&EN

M9FEN97( 9W)A;G5L87)I=&EE<PT*("H =VET:"!A<F=U;65N=', =&AA="!W
M;W5L9"!N=6UE<FEC86QL>2!O=F5R9FQO=R!S871U<F%T92!T;PT*("H /'1T
M/FQO;F<N;6EN/"]T=#X :68 ;F5G871I=F4 ;W( /'1T/FQO;F<N;6%X/"]T
M=#X-"B J(&EF('!O<VET:79E+ T*("H-"B J(%QP87)A;2!D=7)A=&EO;B!T
M:&4 =&EM92!D=7)A=&EO;B!I;B!T:&4 9VEV96X /'1T/G5N:70\+W1T/ T*
M("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R871I
M;VX\+W1T/B!A<F=U;65N= T*("H 7'!A<F%M('1O56YI="!T:&4 =6YI="!O

M;VX-"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U
M;&0 ;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO

M;F< 8V]N=F5R="AL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F<F]M56YI="P 


M('1O(&YA;F]S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A
M=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^
M9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R
M=&5D(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N

M/FQO;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO
M=RX-"B J+PT*;&]N9R!T;TYA;F]S*&QO;F< 9'5R871I;VXL(%1I;655;FET


M<RX-"B J(%QP87)A;2!D=7)A=&EO;B!T:&4 9'5R871I;VX-"B J(%QP87)A
M;2!F<F]M56YI="!T:&4 =6YI="!O9B!T:&4 /'1T/F1U<F%T:6]N/"]T=#X 
M87)G=6UE;G0-"B J(%QR971U<FX =&AE(&-O;G9E<G1E9"!D=7)A=&EO;BP-
M"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U;&0 
M;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO='0^

M=&]-:6-R;W,H;&]N9R!D=7)A=&EO;BP 5&EM955N:70 9G)O;55N:70I('L-
M"B  <F5T=7)N(&1O0V]N=F5R="AF<F]M56YI=" M(%1I;655;FET+DUI8W)O

M;6EL;&ES96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A=&EO
M; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R
M871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R=&5D
M(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N=F5R

M;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO=RX-
M"B J+PT*;&]N9R!T;TUI;&QI<RAL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F


M0V]N=F5R="!T;R!S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D
M=7)A=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \
M='0^9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N


M97)T*&9R;VU5;FET("T 5&EM955N:70N4V5C;VYD<RP 9'5R871I;VXI.PT*





M96,I(#T



M8RD /3T ;&]N9RYM87  *3L-"GT-" T*<W1R=6-T('1I;65V86P >PT*("!I
M;G0 <V5C;VYD<SL-"B  :6YT(&UI8W)O<V5C;VYD<SL-" T*("!T:6UE=F%L

M<F5S+FUI8W)O<V5C;VYD<R ](&UI8W)O<V5C;VYD<R K('1V,BYM:6-R;W-E




M;W!3=6(H=&EM979A;"!T=C(I('L-"B  ("!T:6UE=F%L(')E<SL-"B  ("!R
M97,N;6EC<F]S96-O;F1S(#T ;6EC<F]S96-O;F1S("T ='8R+FUI8W)O<V5C
M;VYD<SL-"B  ("!L;VYG(&-A<G)Y(#T =&]396-O;F1S*')E<RYM:6-R;W-E



M;"!T;U1I;65V86PH;&]N9R!D=7)A=&EO;BP 5&EM955N:70 =6YI="D >PT*
M("!T:6UE=F%L('1V.PT*("!T=BYS96-O;F1S(#T =&]396-O;F1S*&1U<F%T
M:6]N+'5N:70I.PT*("!T=BYM:6-R;W-E8V]N9', /2!T;TUI8W)O<RAD=7)A



M*'1V+FUI8W)O<V5C;VYD<RQ4:6UE56YI="Y-:6-R;U-E8V]N9',I.PT*?0T*

M<F]S*'1V+G-E8V]N9',L5&EM955N:70N4V5C;VYD<RDK='8N;6EC<F]S96-O


M("  ("  ("!T;TUI;&QI<RAT=BYM:6-R;W-E8V]N9',L5&EM955N:70N36EC
M<F]396-O;F1S*3L-"GT-" T*;&]N9R!T;U-E8V]N9',H=&EM979A;"!T=BD 
M>PT*("!R971U<FX ='8N<V5C;VYD<RMT;U-E8V]N9',H='8N;6EC<F]S96-O


M*"!T=BYS96-O;F1S(#T



M*3L-" T*("!T:6UE=F%L('1V,CL-"B  ='8R+G-E8V]N9', /2 U.PT*("!T
M=C(N;6EC<F]S96-O;F1S(#T -SL-"B  87-S97)T*"!T;TUI8W)O<RAT=C(I
M(#T

M('1V*2 ]/2 M.30Y.3DY.3, *3L-"GT-" T*=F5R<VEO;B H5VEN9&]W<RD 

M" T*("!V;VED('-L965P*&QO;F< 9'5R871I;VXL(%1I;655;FET('5N:70I
M('L-"B  ("!L;VYG('0 /2!T;TUI;&QI<RAD=7)A=&EO;BQU;FET*3L-"B  
M("!T(#T =#YU:6YT+FUA>" _('5I;G0N;6%X(#H =#L-"B  ("!T(#T =#PP





M92!I;7!O<G0 <W1D+F,N=&EM93L-" T*("!V;VED('-L965P*&QO;F< 9'5R
M871I;VXL(%1I;655;FET('5N:70I('L-"B  ("!L;VYG('0 /2!T;TUI8W)O
M<RAD=7)A=&EO;BQU;FET*3L-"B  ("!T(#T =#YU:6YT+FUA>" _('5I;G0N
M;6%X(#H =#L-"B  ("!T(#T =#PP

M>PT*("  (&QO;F< =" ]('1O36EC<F]S*'1V*3L-"B  ("!T(#T =#YU:6YT
M+FUA>" _('5I;G0N;6%X(#H =#L-"B  ("!T(#T =#PP

M('L-"B  <VQE97 H,BQS96,I.PT*("!S;&5E<"AT;U1I;65V86PH,S L;7-E
'8RDI.PT*?0``
`
end
Feb 28 2005
parent Kris <Kris_member pathlink.com> writes:
In article <cvvrdn$dq6$1 digitaldaemon.com>, Ben Hinkle says...
Reading the doc for std.socker I noticed it defines timeval. Time units and 
data types are typically hard to standardize. Some functions take 
milliseconds, some take micro, some take ints some take longs and some take 
timevals (or timespecs, too?). Remembering which takes what is a pain. What 
do people think of making a std module (or maybe reusing std.date) for 
time-related types and functions? I'm thinking of something along the lines 
of the attached module (modified from my locks library) which is based on 
Java's TimeUnit: 
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/TimeUnit.html

Any objections to writing up some doc and asking Walter to include in 
phobos?
No objection, but there's an equivalent in Mango also.
To illustrate the API here are the unittests:

  sleep(2,sec);
  sleep(toTimeval(30,msec));

  assert( toMillis(100,sec) == 100_000 );
  assert( toMicros(100,sec) == 100_000_000 );
  assert( toNanos(100,sec) == 100_000_000_000 );
  assert( toSeconds(100,sec) == 100 );
  assert( convert(100,sec,msec) == 100_000 );
  assert( toMicros(5_000,nsec) == 5 );
  assert( toSeconds(5_000_000,usec) == 5 );
  assert( toSeconds(50,usec) == 0 );
  assert( toNanos(5_000_000_000_000,sec) == long.max );

  timeval tv = toTimeval(100,sec);
  assert( tv.seconds == 100 );
  assert( tv.microseconds == 0 );
  assert( toMillis(tv) == 100_000 );
  assert( toMicros(tv) == 100_000_000 );
  assert( toNanos(tv) == 100_000_000_000 );
  timeval tv2;
  tv2.seconds = 5;
  tv2.microseconds = 7;
  assert( toMicros(tv2) == 5_000_007 );
  assert( toMicros(tv2 + tv) == 105_000_007 );
  assert( toMicros(tv2 - tv) == -94999993 );

-Ben 


begin 666 timeunit.d

M<F]M(&UE;6)E<G, ;V8 2D-0($I34BTQ-C8-"B J($5X<&5R="!'<F]U<"!A
M;F0 <F5L96%S960 =&\ =&AE('!U8FQI8R!D;VUA:6XL(&%S(&5X<&QA:6YE
M9"!A= T*("H :'1T<#HO+V-R96%T:79E8V]M;6]N<RYO<F<O;&EC96YS97,O




M56YI=#PO='0^(')E<')E<V5N=', =&EM92!D=7)A=&EO;G, 870 82!G:79E

M>2!M971H;V1S('1O(&-O;G9E<G0 86-R;W-S('5N:71S+ T*("H 02 \='0^
M5&EM955N:70\+W1T/B!D;V5S(&YO="!M86EN=&%I;B!T:6UE(&EN9F]R;6%T
M:6]N+"!B=70 ;VYL>0T*("H :&5L<', ;W)G86YI>F4 86YD('5S92!T:6UE


M(%1I;655;FET('L-"B  3F%N;U-E8V]N9', /2 P+ T*("!-:6-R;U-E8V]N

M<G1H86YD(&%B8G)E=FEA=&EO;G, 9F]R('1I;64 =6YI=',-"F%L:6%S(%1I
M;655;FET+E-E8V]N9', <V5C.PT*86QI87, 5&EM955N:70N36EL;&E396-O


M=7  =&%B;&4 9F]R(&-O;G9E<G-I;VX 9F%C=&]R<R J+PT*<')I=F%T92!C
M;VYS="!I;G1;5&EM955N:70N;6%X*S%=(&UU;'1I<&QI97)S(#T 6R -"B  


M=7)A=&EO;BX ($YO=&4 =&AA="!B96-A=7-E('=E(&%R90T*("H 9&EV:61I
M;F< =&AE<V4 9&]W;BP =V4 9&]N)W0 :&%V92!T;R!D96%L('=I=&  87-Y

M;VYS="!L;VYG6U1I;655;FET+FUA>"LQ72!O=F5R9FQO=W, /2!;( T*(" P


M"B\J* T*("H 4&5R9F]R;2!C;VYV97)S:6]N(&)A<V5D(&]N(&=I=F5N(&1E
M;'1A(')E<')E<V5N=&EN9R!T:&4-"B J(&1I9F9E<F5N8V4 8F5T=V5E;B!U
M;FET<PT*("H 7'!A<F%M(&1E;'1A('1H92!D:69F97)E;F-E(&EN(&EN9&5X
M('9A;'5E<R!O9B!S;W5R8V4 86YD('1A<F=E="!U;FET<PT*("H 7'!A<F%M
M(&1U<F%T:6]N('1H92!D=7)A=&EO; T*("H 7')E='5R;B!C;VYV97)T960 


M("AD96QT82 ]/2 P*0T*("  (')E='5R;B!D=7)A=&EO;CL-"B  :68 *&1E
M;'1A(#P
M+61E;'1A73L-"B  :68 *&1U<F%T:6]N(#X ;W9E<F9L;W=S6V1E;'1A72D-

M9FQO=W-;9&5L=&%=*0T*("  (')E='5R;B!L;VYG+FUI;CL-"B  <F5T=7)N

M($-O;G9E<G0 =&AE(&=I=F5N('1I;64 9'5R871I;VX :6X =&AE(&=I=F5N
M('5N:70 =&\ =&AI<PT*("H =6YI="X ($-O;G9E<G-I;VYS(&9R;VT 9FEN

M;&]S92!P<F5C:7-I;VXN($9O<B!E>&%M<&QE(&-O;G9E<G1I;F<-"B J(#QT
M=#XY.3D\+W1T/B!M:6QL:7-E8V]N9', =&\ <V5C;VYD<R!R97-U;'1S(&EN

M9FEN97( 9W)A;G5L87)I=&EE<PT*("H =VET:"!A<F=U;65N=', =&AA="!W
M;W5L9"!N=6UE<FEC86QL>2!O=F5R9FQO=R!S871U<F%T92!T;PT*("H /'1T
M/FQO;F<N;6EN/"]T=#X :68 ;F5G871I=F4 ;W( /'1T/FQO;F<N;6%X/"]T
M=#X-"B J(&EF('!O<VET:79E+ T*("H-"B J(%QP87)A;2!D=7)A=&EO;B!T
M:&4 =&EM92!D=7)A=&EO;B!I;B!T:&4 9VEV96X /'1T/G5N:70\+W1T/ T*
M("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R871I
M;VX\+W1T/B!A<F=U;65N= T*("H 7'!A<F%M('1O56YI="!T:&4 =6YI="!O

M;VX-"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U
M;&0 ;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO

M;F< 8V]N=F5R="AL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F<F]M56YI="P 


M('1O(&YA;F]S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A
M=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^
M9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R
M=&5D(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N

M/FQO;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO
M=RX-"B J+PT*;&]N9R!T;TYA;F]S*&QO;F< 9'5R871I;VXL(%1I;655;FET


M<RX-"B J(%QP87)A;2!D=7)A=&EO;B!T:&4 9'5R871I;VX-"B J(%QP87)A
M;2!F<F]M56YI="!T:&4 =6YI="!O9B!T:&4 /'1T/F1U<F%T:6]N/"]T=#X 
M87)G=6UE;G0-"B J(%QR971U<FX =&AE(&-O;G9E<G1E9"!D=7)A=&EO;BP-
M"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U;&0 
M;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO='0^

M=&]-:6-R;W,H;&]N9R!D=7)A=&EO;BP 5&EM955N:70 9G)O;55N:70I('L-
M"B  <F5T=7)N(&1O0V]N=F5R="AF<F]M56YI=" M(%1I;655;FET+DUI8W)O

M;6EL;&ES96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A=&EO
M; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R
M871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R=&5D
M(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N=F5R

M;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO=RX-
M"B J+PT*;&]N9R!T;TUI;&QI<RAL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F


M0V]N=F5R="!T;R!S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D
M=7)A=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \
M='0^9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N


M97)T*&9R;VU5;FET("T 5&EM955N:70N4V5C;VYD<RP 9'5R871I;VXI.PT*





M96,I(#T



M8RD /3T ;&]N9RYM87  *3L-"GT-" T*<W1R=6-T('1I;65V86P >PT*("!I
M;G0 <V5C;VYD<SL-"B  :6YT(&UI8W)O<V5C;VYD<SL-" T*("!T:6UE=F%L

M<F5S+FUI8W)O<V5C;VYD<R ](&UI8W)O<V5C;VYD<R K('1V,BYM:6-R;W-E




M;W!3=6(H=&EM979A;"!T=C(I('L-"B  ("!T:6UE=F%L(')E<SL-"B  ("!R
M97,N;6EC<F]S96-O;F1S(#T ;6EC<F]S96-O;F1S("T ='8R+FUI8W)O<V5C
M;VYD<SL-"B  ("!L;VYG(&-A<G)Y(#T =&]396-O;F1S*')E<RYM:6-R;W-E



M;"!T;U1I;65V86PH;&]N9R!D=7)A=&EO;BP 5&EM955N:70 =6YI="D >PT*
M("!T:6UE=F%L('1V.PT*("!T=BYS96-O;F1S(#T =&]396-O;F1S*&1U<F%T
M:6]N+'5N:70I.PT*("!T=BYM:6-R;W-E8V]N9', /2!T;TUI8W)O<RAD=7)A



M*'1V+FUI8W)O<V5C;VYD<RQ4:6UE56YI="Y-:6-R;U-E8V]N9',I.PT*?0T*

M<F]S*'1V+G-E8V]N9',L5&EM955N:70N4V5C;VYD<RDK='8N;6EC<F]S96-O


M("  ("  ("!T;TUI;&QI<RAT=BYM:6-R;W-E8V]N9',L5&EM955N:70N36EC
M<F]396-O;F1S*3L-"GT-" T*;&]N9R!T;U-E8V]N9',H=&EM979A;"!T=BD 
M>PT*("!R971U<FX ='8N<V5C;VYD<RMT;U-E8V]N9',H='8N;6EC<F]S96-O


M*"!T=BYS96-O;F1S(#T



M*3L-" T*("!T:6UE=F%L('1V,CL-"B  ='8R+G-E8V]N9', /2 U.PT*("!T
M=C(N;6EC<F]S96-O;F1S(#T -SL-"B  87-S97)T*"!T;TUI8W)O<RAT=C(I
M(#T

M('1V*2 ]/2 M.30Y.3DY.3, *3L-"GT-" T*=F5R<VEO;B H5VEN9&]W<RD 

M" T*("!V;VED('-L965P*&QO;F< 9'5R871I;VXL(%1I;655;FET('5N:70I
M('L-"B  ("!L;VYG('0 /2!T;TUI;&QI<RAD=7)A=&EO;BQU;FET*3L-"B  
M("!T(#T =#YU:6YT+FUA>" _('5I;G0N;6%X(#H =#L-"B  ("!T(#T =#PP





M92!I;7!O<G0 <W1D+F,N=&EM93L-" T*("!V;VED('-L965P*&QO;F< 9'5R
M871I;VXL(%1I;655;FET('5N:70I('L-"B  ("!L;VYG('0 /2!T;TUI8W)O
M<RAD=7)A=&EO;BQU;FET*3L-"B  ("!T(#T =#YU:6YT+FUA>" _('5I;G0N
M;6%X(#H =#L-"B  ("!T(#T =#PP

M>PT*("  (&QO;F< =" ]('1O36EC<F]S*'1V*3L-"B  ("!T(#T =#YU:6YT
M+FUA>" _('5I;G0N;6%X(#H =#L-"B  ("!T(#T =#PP

M('L-"B  <VQE97 H,BQS96,I.PT*("!S;&5E<"AT;U1I;65V86PH,S L;7-E
'8RDI.PT*?0``
`
end
Feb 28 2005