Why D Needs Attributes (Was: Command-line arguments)

Nick Sabalausky a at a.a
Thu Jul 3 21:32:17 PDT 2008


"Jarrett Billingsley" <kb3ctd2 at yahoo.com> wrote in message 
news:g4ju5s$2dh0$1 at digitalmars.com...
> "Matt" <no-one at none.nowhere.com> wrote in message
> news:g4jqum$269v$1 at digitalmars.com...
>> Is there an established library in D for handling command-line arguments?
>>
>> In particular:
>> - handling differences between Windows and UNIX shells (i.e. wildcard
>> expansion)
>> - handling equivalent options such as "-n 10" === --count=10
>> - handling combination of multiple flags, e.g. "-lcf" == "-l -f -c"
>>
>> Thanks
>>
>> Matt
>
> I don't believe there is an argument parser in either Phobos 1 or Phobos 
> 2.
> However, there is one in Tango.
>

Command-line parsing is one of the big reasons I really wish D had C#/Java 
style attributes. I came across this one particular C# command-line parser 
(written by a Peter Hallam) a few years ago and absolutely fell in love with 
it, and by extention, attributes. (I'd link to it, but it was on GotDotNet, 
which MS replaced with something else and didn't move this particular 
program over. So I'm attaching the lastest version I have (only about 11k), 
even though there are newer versions...somewhere.)

Just check out how awesomely simple it makes this sample case:

BEGIN CODE
class WCArguments
{
    public bool lines;
    public bool words;
    public bool chars;
    [Utilities.DefaultCommandLineArgument(Utilities.CommandLineArgumentType.MultipleUnique)]
    public string[] files;

    [Utilities.CommandLineArgument(Utilities.CommandLineArgumentType.AtMostOnce, 
ShortName = "num")]
    public int number;
    public string[] junk;
}

class WC
{
    static void Main(string[] args)
    {
        WCArguments parsedArgs = new WCArguments();
        if (!Utilities.Utility.ParseCommandLineArguments(args, parsedArgs))
        {
            // error encountered in arguments. Display usage message
            System.Console.Write(Utilities.Utility.CommandLineArgumentsUsage(typeof(WCArguments)));
        }
        else
        {
            // insert application code here
        }
    }
}
END CODE

The WCArguments class is itself the very definition of the program's 
command-line arguments. And attributes can be used to specify things like 
"DefaultCommandLineArgument", "MultipleUnique", "AtMostOnce", "ShortName", 
"Required", etc. Later versions include automatically-generated help 
screens. And the command-line syntax is the same 
ultra-clean-consistent-and-unambiguous commandline syntax that MS's 
command-line .NET tools use.

D2 could probably come close to this with its compile-time reflection, but I 
don't think there'd be a comparably simple way to specify the things that 
this uses attributes for.


begin 666 commandlineparser.zip
M4$L#!!0````(`,A-OC!.BLJ>P0```#8$```'````07!P+FEC;^V2L0Z",!"&
M?Z )F^$1F R/P6"")D1?I8.):P<''ZL#H^$Y? `'MWK7P]B""QHVO_9ZW'&4
MYOH#"5*490'FE@)K\D4A<94`JXP\/9=D-;A>^7>&:C]C>)(9<3PX18NUEC*.
M)YD3QX-3M/S,*4*K3816+N3^C\?Q)>0\[5_[8M_WNZ-6UY .B,IKS,6-L"0W
MLYQEM'\>_J]B[7NMOW5NL9S.\T&H0\.:@S_%XVN_E8MK6KF0II-][;3/?-Z9
M)/R=V!-02P,$% ````@`R$V^,$-5J%VM`P``>@D```\```!!<W-E;6)L>4EN
M9F\N8W.-5EMOU#H0?@:)_S"JA-A6/>%P'GN.C at 1;BBI$5;$%A"@/CC/9N$WL
MR)==\N^9<2Y.@"VLM-K$'G_S?7/S!J?T%C:=\]AD[[&L47IE]+]/'B]W at O:J
MP6QMFE;5:#=H=TJB([LGCY\_YR^\08U6U'"I2V,;P3 @<A,\"'IP#IN\[D Y
MD$9[:^H:"_"5-6%;T2]"24MFSTXCG$,/I at 3AO55Y\. at R6%=";Y&-':8-V(DZ
MH -OH#&%*KN(IA(+AF,"1BKAR>E>^6K.*>LE?!G?S^#E\'2C?(VKHZ/CK[_<
M/D<GK6K9QV&CM=&EV at 8K?F?6M$)WAPVNK2F"] \AM)U5V^H!DQLK"FR$O7\`
M)=0^V%[THT>S]'Y$ZTC!/+! 3_- <F:=<MY1XI8II:=@AT2=39#Q\T[<$<J 
M/EM6.BU#6G\55%W 56ARM&GU/>[4>#ZN?C8!)%%S+4HN"5'7Q&BJ%8+N!HL"
M2T&:>7>"(5'%PI/K&>0=Q+:(QL].GI%R<)79:\B1A)*R7\9T4+$Z>I']G9W$
MR$]$+S61*=!R^3JUU<S+3A&-+)O@?!("]]B1,1'!C B7\6 at D%/'>*6F-,Z6'
M[.KU#5Q8T>#>V'LHC P-:I\RUQB+BW2:E,K(A91F$]$/+G;>K"%[T>1][&C8
M5TI6D:!R3+!@/Q,43%A7AHZ?C5E=G1S#90G:#"<'K0J+T]YCFAUDY",>%MGL
M]%OLKD at G6 X'3X(Q3)7P4 EFBERYS at L>._04@=>V:\EV&&81K_]0K^T4)V6U
MWEP?@QFRT at A9*8T9^[M0]=)?20M]`&(X!'E+B#V?;"&8*8Q(7'#\/BB9ZE10
MAG+CJQ]#DI!G/=9:0R,YUJ>1,EAW-C-;O1A\)A]2<-UR:^HI)*3W-(9MGL5L
MCO//3SB%P3XQ^(V:/TI)TOKM?BMRC\ 1</I$Y^D$N5WDRIN1&F/WC%(D%QTD
M+0I/T1RA3J<V#T/Y.IWA-X35A at J6`L4"CB%X52O?S75^JG":'D/'3Z#QI39R
MZ)I%)GD>!)H;^;R>+-9DN\.A4SE3=W31`EV.+=V/A;+T9FPWU(^:5\[3Z\'X
M?+1Z>FORN]O_Y/QB^3^#"V,IS*)IF:$J8\F.K!:0/?48VCF;1*./VIYUC"%@
MPVF>C: ),DT%'HEI!/YX9'649;>W_&TZ;@BG[WD<IF2>4Z0ZV/03 at UC'ZZ78
M"2V)KVECP/^B_P8QF0>'72+VAV//5\H=_AL023&G52EJATSXL,3#5VO?+Z/!
M=U!+`P04````" #(3;XPF%*96M,```!@`0``"0```$-L87-S,2YC<V50.VO#
M0 R>8_!_T- at N-5W;4 at CM6C+86\@@[M3XP/= 4 at JAY+]'YR3@$+@'G_0]A X2
MTA[ZHRC%][9IFX21I* C<#E&3'X*B0JR$+?-?]NLNJZ##SE8CX^?5]Q?('@2
MQZ%HR E^,\/7A"*O+S=5MY"YVKH2#%;G>^M;81@)(H8$E-0B2 at Y)9W.U!I8R
M!8<UL*8\QJRV_; >1B;TNPI%C>S at +P<//^;Z),JV@>T.D/?R;)1YE.HT?W6 
MS??F#=;>VT8\@68P$]9E-HS$M)"=[+%KYPQ02P,$% ````@`\7 H+MG?*L1]
M$P``^'8``!<```!#;VUM86YD3&EN94%R9W5M96YT<RYC<]4=VW+;NO&],_T'
M6)V)I(DL.YWS9$5NW5S:3..FC9/3AQP_T")DLX<B59)*[";^]^XNKKP#E-)S
MJH=$(H'%WK"[V 7@)-CP?!NL./M81'%41#S_[6^^_O8W##Z[/$INV=5#7O#-
MHOYH_C(*;I,T+Z)5WO3Z/5_'?%5$:=+T]D4:R[>-G=^\:WKZ@=\7\%R\.3DY
M8<_SW6839 _GYM''G(>L2-DJ38HLC=DVR A$NH9'T#@)61PEG 79[6[#DR*?
M6^!.RO ^O8Z#V_P:OXH'V]U-'*T83W8;]D) >PO +B2L#P];+AI*%M;P+#]^
MDX31*BAXSHJ[H(!_HIRM(QZ'#+YD_-^[*./AG%TDC&=9FK$O41RS&\["*-_&
MP0,/R^"B-8L*[)JD!=MF/ >4V)<[GB at FU(AN)%Q^WLOQ\?N2G=Z?/ILY$?4N
MB1_8YR".@(H$Q?"O74*"!O2+.W:YBXMH&_,*!B]WVYAX at 5UW/!>T`@W0'.$$
MD@<.B'],HG_O.'Q1B/_>#?$W2501A]$2M at D>D//YEJ^B=01<V:09AR: 5YJL
M##5U'JQM0"2>@*VT]O>3HQBFR?D!R'$BZ .,&_)U@"PL0#79.LU -Y)C,WRK
M1GPP."N5TAHY8S>[@@45K837VS0K>*CUT)5;351?%)=@6MY!8TGUJ25$)^I?
M=Q [HVEA"Z8-WQ),0AZ "L*AAZ$9+ &TE]K+TIK0Z7<<Y$4)H&@.R$2K.Y:N
M5KLL9U$%KSC*"P>&O078[Q "!QS_&24Y6VK5V4MA!BC+EF>;J"C($ NRV$9I
M<1&!QQ$:%.HY7P)7L@"K8)=SK6L`S]8T![8H%BBC8)C"ODE+(17K4?S7Z5PN
MXCC]DBO?4O4IRLS.K0Y%$:SNA&4/BB*+@&Z.5(" B@`D)>Q]#J"0XT UD!N:
M_H%0G)"#FTT"%$*K(U.C=_FS"X7"QSRXY1/]\P,`X2#6UXC,]+KD[%:@M7F3
MM].]V1E3W[W<GQ<WZS15GD/S8,,PH%F.D)6C<W8EYS,Q46K0ZHZO?@:P4I7"
M%$9*RU-N#H,0-#F$848G&R8M$0$)=BI *>:8#^G&G&;;DEHNS.M'3Y/WP8O*
M?KY*HMOHPG]:R0)]8E]AIA:[+#$T+FR:'IV(>D\@0(39CM>\:1B%Y)KN at L_"
M2MRC20'OD]^!A4!MT#[;R5Q(BF]2T,>7PA)>(:2_`2 BLDQ7L@,3M5P*^G+9
M$(D<)#H+YW0]4%9YD:'8%=(^\K'Q+[?-L6VE$5N2G:Y(U-'1#)-IG":W!Q'I
M6P!$-/2)%$?<1Z+8_S "190=Y/F2W^QNYQ=YSK-B<D0T5&B>+B2EAL)VF9LV
M72*OLV6;19_!KRODC6:U-L$Q6EITF%75_+%E4=BQT"H'9R;P,2(RW<<G8P9&
M=7P\QF75.KH'6QH_E 0J.%,*(K^/(Y;B[/''#:\'N>@]&/?K<- at .['+UV_ at Y
M8S<!Q*.3=I?^Z*:1?P\RF*,88/>F)?"+,2E;ZJBT;"5BP at B7#6N.J_5UEFZ(
M.?4(DQZG-_^":%[#-.K:$FL6:DQ+G7_$E:U&502N\).?P:#%C.WP7SFQ9V1X
M9Y0RR>U .D\K`'"PBRP+'K2MO$D_<PT<?D,?L:BV4#'?7I6U)=U2<@D6$ FH
MC0HR8Z#SYH$%84CI$(=Y at J"+M(6C589)[C;)[@)R"+"B!=65_55*`13C9QY2
M<@3!N6BL at 1J)^0G$T 0UZD/P4ERF@]D2UNM$62^Y8A=R58(WG1O1?[,FGVRT
MI: %M%9(@BF44!D$)0)4<IV!XK <TE K')W;"]":[ZS8'=F'6E!'#55#,/&4
MZ9*!"%9W8"M6!<\D9!I*`GJKON:XI->Q1_S0-&/,`#DL< $R\'1':\JY$J/=
M1O&=UG@@B_1S%!(G`S,?$9\F`L*44Q(&%7D-*!5"80*;31F@[(QQHXXJ[1$9
M"3'K<$J:6=B<#F FG:NAZ==J#AHT*MF 1D?IM at 859M3'H[W(./FS@"7\2\=*
MFKND&FM^3(&XLLWSZ!SU$WF(NBQM!!H5,9#V7EV 9<HC0UAEFZ.GEW28N=_R
M57!P0 at ZO$?N9L*SO)0),8=*SHLU4^Z7NL6AH9I1DB0(1'N MI+PFTZ[FE\%6
M=OA+D-\5P4W,:QU*OY!+:'O8A$*K-\DZ5:GVI)GN^9]Y06WSR533:N at M?W 1
M,SD25NQ-?E4`A!5[\H3I1Y!<+C K7'KX-@*N!+&$7ANA_NF,^@+];<D`=Q/?
MT'"&.W7$3<_(*<"4"#LB#9_RNH0D*6V<@@U++EIZ&33KGZ9^4 at O43T/*3(AW
MIK6O#?)C\V,>Y]R;S+)*SR_"<.**G0=Z\*CC9_D7VN%0^S'IB-#V;()MRP11
MV%H.-ZE0UC\?R at M1:]K.7T D%H#C_RM_F.B(0ZU.-1NZ9OZG6K=K4 /U<-$\
M.76?5X(5)J^#4U*_-4^/A$(VOYV_Y<DM^-]S=NH^>SUY0H-IIO2JFV*,Z>O 
MF0&J%&TL59*1`J[*Q at 7%!A#2_ _4B\SMKT"D@(>?)!UMQX&%V9.D"8J>U';)
MGU0]:&L@(".=3]?&-8&;%YW0N[Z D#G=7.AWM*I.UY-.UP.6,P#3C%.BU8WE
M4I;H5)[56:X28-T#64A_.KVF;0=MD[EYY-,*CG:&<>$HF\\I++1%Z/4QR?@J
MO4VB__!0.Q2QR-9*X1B3R6YS*)%N at F(RLD&WA,3CKZ>/X]',C#1=#*]38,Q)
M"ZQRE1.S!RD\E7HS+/S.1^<.X;05/[>V%^+*SU666E<A14D3DBV E&I4$QWE
M/02E2EH0UBJ)P9Q 7&>25#N>;Y6A@'@7A"+3L103H6$>(&1EZ_I-J3+,55V2
M at 7'N9PQ5;\N:^D>+.:QM5W<&&,P_"<03T J2=9C_..MK<D)-VC^HFI##`JL7
M\GO+"L_IP;OU1?* D1ZE%D"V7\=GXQD;/X5_8/3'&5BA13=\8+[)6MD#7.UN
MQ+O)LYF%P9(=/V-_8%5V'[-G[,PT._8<^*+N7-H$+3JH<9_"N,ME%1TIM &"
MDY\*6FQ9-9Z.$7,UL&]1U6= 1XDN.U+X5'M[C22#I+\#F77QUQC^^^G^?/A%
M$.]5R<?^<;M;V"$F6YJ0<UH/L at 1RUPX*3["$`NXO\ Z7KCWLHA^,<0;DI/;C
MZT$40F/T;<DP,)Y?\>)'+(U-RJHR*[F\_1"_`0?V\Z+/Q/]Q?.9B"<%Z)X"9
M$0CN3W6E^"V_?QW%7'>=-)EQ"&$A,5\=9>HQ3#VJJ #SXFX/^U0V^JQ_BC0F
M:(X.-6=*JM4TE-&UX#MHV4&FQZ]QWBOY>W;?,S$E`F=-R>%7$P/3][!^*.UG
MQ&291Y[>TC<$U%%/#>WZB>L2)$E+J7[VA6?P/5FENZ2 K^'<+$F:M\ (;AUR
M%5(W1 at BS-O.JN211J:7BQ2;*L3:H]Q<;QCBDD(9DCVQ+ at C[J=91$^=VDA'%-
ME?<P=CTH-$'RQZEQ>AVYSB^GF7:!E<L,JZBPPH@?X%=PJW?P`*8K2(*(4C1O
M22/D#Y >NW>8FN7=3[A+IG/K4R^_KPC0GW91' (%-^)_43PHOYLTV=_*$[D>
M3.-0!+6RQ_ZZVNY%S&!LJ="?ET;OQQD^NNO%=@LRG(Q(!J/IPJDUH*U3[FU=
MH) H=\'3-S'!?E2_.XI05I\EDYE X/+4/WU0I?'L.< Y'WE46)2_;T5L=RC,
M=@='#>WS`5#[]/3;\?5!$1-S^0"HG3T7H ;QS7MT.]%KZ(+J[2O8TM05K'D0
M]+5&2=7CBJTK_?%>5YE;(V^7MH<EUM2D+5>\]X_Q$291.NUOBQ]JJU*A#H%S
M?Q#?(J/QM[%+8%[N)=E#YG)XC/[HK$CCQ['GC.A,Y)8K9\KXR_I:8[VJ5*JB
M+GO/]C$;SW ;*@PBW-U$-M I3^,:H2CA#'=$6Z%POFS `7IT+)%Y$'97!A G
M<1_F?^-?L#(U[:_T&="#(X:FN."/S]>0S `KV]]^;RE5QW_/@Q"/?V[3!%P*
MXH&BHG-Y:E^A"UX.O!1/]HCN#QFT-8GAN6MXUH1S;[Q6'?'<=30'UCJIJ5BI
M:.@?4A&.0QSN4LZ&3VM)&X/TLE+"`UJ0B)^5-6X=I\N at N)M?!O>3'V;LAU-V
M;/7M+7_:9<!:7E#&0J37*!R1$32+<M6N'4,)@$I]LBSBM XHLH?>M9(X<S]!
MC$$6/- at 0GG*Q9)Y.-/;T\#(-^?P=J(;X>;%:\3R?XSR>ND\8I <&HEJ:& 4!
M\(S&FDX)W(?T%:B?@[Y5?JX"*BJ^NE]Q467C_<OTSK(Y+:SAK$6 >U]2H+QE
MT8NXBP(Z.X/_GU$AW3"/SR^!4\%MXSX?HPM*RFTS2,9 -1:XU)#%NPZ],?LR
M$2'ZT;MAL[SDIHIY at G;):=5->$;)/W:IW#12)XZF=R0+LJ>+GJU+7^Y0"A/1
M_CDIFJI2^L\0"0QC<7?=QHW8/T=;[%R(2S=$NQ;@6$J&R/J?V/H*6U->[1,1
M<#U@%24H?PH[8 at X1LP`QOV/'J/#B!$>*16?(;Y+JMT>5A at 11//W=^#L0HIE8
M'N\(QOLI&>^QX'$9N#U:IS,H4;+C!^)_"&?K+3/3V X:^?.W04X__;07WV!K
MX%4,&[5A*A/W]F<S?$I36BXW<JMP[T>#`QWPT72XX <"[5]!-V+_[1NK:N[H
M$,AK&ZR".&3*3!'56X/\7U3(VG"<:,Z?G\,6 at JG#8AS9>XK,,WV?0%>'U((#
MGBVXCIS2! X['/J9Z8&HY4B/U/?]T1R6LT#"&FW,:"\3XTV at DYD!.H8)"/#U
MTQS;N7]'S!^5U3SJCB_ !&FFMN"C(T$ZYV HLI9P;3VMQGI]?#HTH!>7@\F=
M>+OBW?I]D-QR'>;W!_G at 2V_A9-VK=Z];D@&2$1[5&I=UP\?D)HCQ]&,(OFDT
M9E'_^L%:-Y1XZ[<WP+"Q/BF-9 ;MA\?;>TJ'@]79/V##!NN8=/X667U(E?+9
M=V"OIW09?*H'AI'H?[D7736!8??:OF G)NJ7.DS<SG7-F//.>[7#7?=56]=P
M7NN'M;LA8$>I25FS,ZNE;-)[.TTSH90O_:Z4'M7.@&C:D2S#:C.&A&QMS3J=
M/9N6J"9@`\BFU:O"R)?X7EHU#:43+4=5L9J!G9-5`GU1PWT5<WD3 at L>)#S0A
M;W)S&IAZ"Y4B&/A[VGXBPVJIZE0V&DA'OPL><,P"Z>ZXZ(BN at 724GH?J1NL&
M4;8SQ\@7D6I at Q;[<;R%_7KY#S4<&;1#U[7Z#)E:-1(=;MM2=-Z)T2R9^X9]0
MEL/3_1=2,0<@8,_:24/.L;X'`JQV;[N=:T-A[)R:(KTM#4T-W-FZB%/\2A%J
MG"IO_='MALX[AW/KS8%,]=*C]E/S\U:OTGJ,E=M.H1=^AU-K'2%W at DP0/5'7
M"H^@;?7O[K=&ZPD]R(JZ#T=OU7'!5F(Y3VAS4=L>`/?K"'33*)?^$]HV>EK?
MX_+.14?;L+G'W(3T2G44[.B_3L&Y/E<YNF^F1HDGI1?VTF'1=S;<)AI,C;@5
M4M]<RD8OZA>.T&TKZH(X;*XO%!GUCR>\&(YDCPP#B1?B:J]@BQ,/KY40=TG7
M4>@?J<5/2'O:\6EV<-/>`4OZ at T)IP,":Q%,'3"9'59 at 6`'T<QFMGJKT966YR
M+6\_=ENTZR+]'I.&3(LY-6"-/VN>57IU6#6(+LM2_+1&2L)-78J=T.KJ;>T"
M_1AL59Y[X'JQ6?6FQ08]NQ+6UZ<(9N I*]N1]&M+H%RV;1AGX^>0)CD?ST="
M@/:]$KY;`@<B< ((>(POQ.^1J;&+O4.TPCI1KN]<5_I LI2TTF[!?2OD:@29
MOM)L$E7P*I-F8LSAYN2*UTD`J$/-BU9OTGC;+WDH_"#^^*H/:H.C_E3#)E0]
MMPA%L!'#"NJZ:+F5 at P),:D$3W>S]GFEY[#04H&P087M:?]U=^OPG3YKMO;[.
M8Z+P'5!X[YQLQ!(EW0&,./1NYR8VZ(N,\)?/ED=XY(;44"<M<=I[\QG,`3]C
M*HP.!4%:OWMM2OW*Y5)P]8?Z,NM,/,+O"Z\L=X.U_U,0?C<[3]9+_9F(0)0`
M"##MVL3S0,+BVP4.M8]S).U"V>3Y>@$[YC$6R"1FU'VD\K^701&0(9)6S94+
M)R<4\2*IJ?X;'T at CC0P_LP@7#7EC3[[9%@\2`6(6_\PS`:+9PDT,LGJM]>U;
M8Y)FBC;,:F_G^\U3:V'FL2D/=D1YVQ&RL#[G/QR*ID*AEA8]%15QG]T.YK.4
M52W<S]@X$!*M^T6%3T=/1_MO^B"N]1\<\>.9P^X`S;L*3<<'I,GUV,=!B!J@
M)Y"2W4--%)4`94XVS6+E])=2_=W_.4V#,2_GP=R. at -D48UM)LG1(QA,A3;U'
MA/8BO_[8;*'P-NXG)Z)CZ2RZ\[@.FY]J+9ICF$[E4:P?NF^Z!1^'O\S 7,._
MMC^^@#_K0S;6E0>.7"U#^(:7)0[L at PA5*_QY8+)1?F.*[8!66>)):XU2#3 =
MQ!K"4B40!C%&]ATF&1R^E$GW1,&#3VJ /?B$JW!?)GE at 2. 'XD<+"/_5G55T
M'[!XHZ'KM6X_%)J*" .90)BHA&W_70LV&I62FN?PO7\CAKG]L1E672)J^^?2
M6$W%ED;5PG-S*Z%)9G%?`N;PUVY(R5OZF,,YE<Q-2X>6RG at 7#[0$78O]&B=3
M,EO46IG;VYEUDKC>SMSH5CG>"$V]: .4R:_\%U!+`P04````" #<3;XP7UWA
MYE8#``!!$ ``& ```&-O;6UA;F1L:6YE<&%R<V5R+F-S<')O:N58W6[:,!2^
MK]1WJ+AOH%"@:%FE%&C+1 at LBM-T%-\8YI%Z=.+(=.C;MW6<G`0HD$*:U4U4K
M%XG]'9_O_#DG,>^)"!&U9>@0UN?L.V!Y?GAPI(;9M*^M05\])"-9'LX"./I\
M5. at RC&AA9=D)L;P'+ at CS-:)NE(S&::WV`F3C1_#0"\R)42ILJ+@*B:,7?U7J
ME?IEJ7UR7#VMEX]/JXWR\5F[7CLN-UN-5J5<JE8:M=^)_/ER&_,B)-1))A:3
M-DA)?%?,IY?#"@)*,)**4P?'O-2403 KI("%`&],9U]AUF2^1,0'?HN\R"=;
MX',(9IZ'?(<JL0!Q`7R+3(\3E_A(,JZ471*:I:,%$Q12V:0$?&EC3@*ID5_B
MVVR!Z^%-MX]<Z*(9"R.1*TZ<;/P0<1=D'$.-[K2KI50T13.;N)$C)X@*2 'U
M0AF$BV1J_TC##!B3VF\B0#BW\VR)N R#WEAG4HK#SC=%3!7("7'UPN:8!ZX%
MX] MI&,L2MGSG2_0!"XHPT]BU?+-<8$$6([#0430\EFU?%*NU<L9\.8CX*=+
MQGM3X)-(E1/?[-(3&Q;R*+>UM(HOK&?29K"5?Y6DD,B7(K*]?7%W]6DXL)KM
M+"&&0T]E7Z1HIP+E27OFC1F-=I<\S.*O=[*H2B6]M\:>EAJU#&S'QQPB#C2J
M_QU;]P))//(3MKEPF:A])!\U<DS\4<1_E $?@$N$!*ZBU61>QU>W+%CHR!3R
MV!0TV 6N at ITC@X8<D'Q W-='FB7:G#.^4RC!=V$*-/)F"J[XMP4R``HJK3]H
MB;Q6<6CJKU4=>N\\Y:&J*']U)&GP8>K#+,X;B_6%`4R @X]AOI*^NKVJ[)GR
MEI?PR&H4<H&OB;\(E&&,LJZ'SFVK]V"/;@CF3+")-&[;P]$E5RJ>&7\:34]4
M6U>IEZJC6)OA4)K#3?O;;+201'L9'DF\L?5:Y>NYX-M-=S\/*($W=H#2F--^
ML[A2$<OI]7;=U ?;1CFI$XR&#JQ.+_%9)P?51J^W])LCXF!AF7R7Z-9>'98Y
MK-J#0!*RCC]A!A891.QPK+OBF(0#>>EZ@:+P3^DVXV:[J]YT%G>C%YAX![0]
M]47V#FC>24*)G/TWIF9Q64_+N7GAQ4_Q'P#U:!;3_Q,<'OP!4$L#!!0````(
M`"M3OC#_MW?@5 $``.P&```=````8V]M;6%N9&QI;F5P87)S97(N8W-P<F]J
M+G5S97+ME=U2PC 0A>^9X1TZO `^0'4&^1F=0:F-H+>A7=)HFC#)1H>W-RD%
M% L!KLE=-]_9I+MG-O&,&TL%09MSE6CU`1G>M5N16W&?//32I/ZJ(O>6B[P.
M;(,$$+ED)DIA`1ID!@G%(KJ-.IUHCUVG57+!F=_XOYYI"5XY at +EEG69F*.E<
M0(\D%<3<T5ZQH,) 2/%^IF0J2RHI at _Q,'7D9$]!?H$_6I5 JA I?I\C/4#S1
MK."R*MP!F"#5V,N0*^FINM%'8<UL"1)-*&M"6?!D=Q[3M QATW0<0MZ4_G3E
M''#M[J_T*LAS+!Z'GD)MFTK9O=2B*0B at 8<N=[("K2:\F/=6D<7<S=-W&+K at _
MGN,)%J#K.FX4?S/UU7)5`P,P#J"^_",E<M#5M0_B4YGY.7\<FBPWW;S9 at VI@
MQN'[5[-'7(!I)E^U-;C+M"O,^M^WCU7<;7[2VJT?4$L#!!0````(`,A-OC `
M1L;W5 $``*(#```5````8V]M;6%N9&QI;F5P87)S97(N<VQNG9%/;X(P&,;/
MDO ="">7""F", at X[R)\N.\PL<]F]PJOI4EK2PK+%^=U7%):@.Z at W>)[V]SSO
MVV>:2Z'$IK;>J6H(LU9U4U!AK01K:BJXA2F#B86%+(D^`U*U8N at B9!HO4GQ 
M7H_M'5YD*, at 2Y/C(PX[GI;X3XR!V$$I0@,,HPW&RM^^L!\O.15D27C#*H2)2
M@;0G_XANKBI-;[V='_HA1IGGS()PZ at 2S:.K<9^'<F29IE/I3-/.C^=XVC8P7
M72/3>&1B39AIC(X?*RWJWN-^JD3P#=TVDK0_;:U*0N_I2Z.COR0EN$B[*:R;
M[8GN:?T5&! %VM'9 at Z2SY*Y9"A7P`GA.01URA:K[X"LPP_[GG-%E2W,/@[D+
MS?Z$9+/M1_UQE]G;U9BXH:QPT:V0;IF#-IUV*ZIK= *Z9,_95PU<T35EM/X^
M6C>]UX"S*(HG?AGF3S&-7U!+`P04````" "J4;XP/7=C3Y0!``"J`P``!P``
M`&UA:6XN8W.=4LU.PD 0/DO".XR>2D+*`Q /1KV)FBCA0#@L[5!6M[MU9U;2
M&-[=*12V!.+!;9/9SL\WW\Q7M*&$2?THIM_[Z?>N/.9#,85'M,UE:0+V>]M^
M+S.*"&;W=[X()5JF73[(J<+2Z R6SADPVB*-S_T;Y_-+_FRM_,$_G[(VFC52
M^H K%0S?N[)4-G\2T$/;)"9=B+[7%:83J=25P:G57P$'BY.NQ%[;8KZ E38[
MIC)CI_'_.M[QQ!&_V R'\+9VGI]5B7 +-[+6FX; 5=M=6P;Q+=&/C\Y(Z2/8
M3_&/1FVD%08R9YR_$)"22AEDQO%.HBC201O!5BSYWT[G,%':)L=FRA<TV"<U
MN?O3U5>P/6$NWR2C6-QT@\E@'(OT"I+KN*7]K4Y?F_K.RF)QTWO8P1^T1(YD
MXAF-`+UW'M!F+EA&^4%EC: .8"D\:*J,JB&0*A!*I,:>HKS5Q%B*?I:<P73F
M-6-RSO at 2V6F#EK#([%9)W(!P[JY@&Z]H"/\81\@3>@955:*DJ..L")PCK&6T
M$\#6R-L\OU!+`P04````" #E<"@NQ7,,NWL%```2$0``"@```')E861M92YT
M>'3M6-V/TT80?X^4_V&;/I!3\W'0/E24(HZC"*1257 (58B'C3V)MZR][NXZ
MN;3E?^]O9OV1D(,6J>H+]4EG>W?F-]\SZURZLM15KGXT%:D+OVE*JJ+Z6?M 
M?CR:?^0:C\:CBR86SM]5-47RA;8/2I-Y%]PZ+C)7, at 4CF6JCLE:.93FZE1-4
M=$ICKPK.8KFNK<ET-*Y2)F"#F?!<>[>R5"[4>'158,.:E==^KPH`6@)(01UI
MU.&M<FOE2><L=I"T]JX4R$$/X/'CVEC+M*82I*VV#06\@3KN:UJP&5=.-8&P
M/XB?J9S60&%0JT-0N\*!9&W(Y@$*U)X") MFKJ/&@XYJ[QH/N8>F[G3R!'@R
M,EM*J at Z:.]'K2/.%NBJH4IFV%F OH[$F&@J+]+1?2/S:T')D+SJPZ1D$B<6"
MZ5:_4A;5SL2BUQ. HL"IS!]T5B3[6E\EPUL_M $[C7**&XDS$1MF[% ">S6'
M2NQU`^G4JR$A5#=JT@%6NCP&[#6)Q[O'>KF:W9["BKU:<AV^K%)"=2'LD9VU
M;H<$$0/"7>:;JQ ]EOC)5)%O37M?.6?Y3E53\EU[K_<=EEZY;7($HSQV7M&U
M+FM+,Q6:ND;^<()(1J2$T*VK!V_"AA#5&JR[3$UWSN>PKJGB&7L%2U&_%0=X
MZBS55I0B70U)=5?-[4S-=S/%;IEG<M."S;JN#>I*//2+:QC?YLE/K$HX+."&
MJ_O83Z#/2=R4TN/599]^X]$?XY'"53<KY+_H)4$)WYVNLVTWK6>%]L?K;31>
MOQ'%>>_=H?A.*LAT!/76F5P]TZ::=GQL4#A+1$R;KD/-D_DYWH/Z7E6T.]R<
MGGTW,)FUFG[Q*27)LF<'^&=G*J'UV at S7<JG(>\Z;2J).GCA#AH LU",3:JOW
MB(S>D"HI\/T8Y<4^1/33R]1W%Z^\B30]5?DF;5\RVI0SV*VG at PN@]*$/W at V/
M9 -]Q!PHC^J+A[U?\D<5,.T$\%T;V1=.[;O$E"Z8.K/N,5)+&]+R9 1%E\H&
MKL:[]/N6W$DMK+3G9))Z3[)WV8*N22T3^3)M at KQ[!$??4KS;>%U""6B6IW@<
M*W,<';5#-X?(_/WQU(<5`2;IE>^K,[_FA9<59H?;5.9W.L88VL:M^?4MX6PM
M>/W5G_,WZD-7P%B7+E."O&7C>OP$MEW+QN7Z"6R9L'5.O9<J]/[?LJT3VX-[
MS ?RCUS/N:MB.-<.J2=!EG9:.M]US) "J2,Z<4 T*<:](AWV"_7$[6A+?L;Y
MQ_W9[OMN[4J3IOVD57["N+(R'AUU5AG?&%91&QO2*K4=%L;**%KQT*JB1WWF
M;9/-FA!=R5D1X915$SN at X1V)9+*BX^P``5;HK>&3A_:I,]]0VA<=2MM]YAU,
M2(Z6 at 3I3U@%0'F'^;XU!`\(0X;16>9/JC^"_1[36C8W_2(YP!_8?.Q_^:+W(
M4B:+CNI**KQGQHOPP3W,4]D]_J79?3HS91(L4N?H at M)6T%"LU$82<OZCZ?7Z
MM.=^V&]O_I]XG_?$J]R.DQ2E3">'VBY[;YY6,M7Z^61"&DR!HO#*MT?T#?'@
MZ[<XL60+J^D0*_T`.=0=^,:CE$Q!38 _$>X)I$RZHS4GS7N#;H4QA>?/98K]
M:^.("04KW&=//5W+_,E==2MV\^?PH,%XC96O2GEM\SX=FCB>-CAN?%N3(^4T
M1I&E#1IWFA\I!U8D)RO*T^DD]I]*_&T+2T.JRX"VSUG0#1L)_F5!Y,,,G__\
MPX!Z`AQ=8OE+:%+6QF+M$<:H=37_RO"L^]$`N[X&0/?W'&II..4G)S/EY.>'
MV^?+\SO+.^?G=]33"I6,+YV61?9N?Y/V'C8;]=@@Q<YO+\^_Y;6OU4,G:]Q)
M'N!?9IL\.3_\!5!+`P04````" "=64(MUNT64Y@"```X"@``"@```%5T:6QI
M='DN8W/E54UKVT 0O0?R'P9?:H&1?T":@&E*+Z6$Q*&'IH>U-+*WK'?%[JR-
M"?GOG=V5(JGQ5P^%0'60Q&KGS9LW;U9:K-'5HD!X)*DD2727%\^7%\"7=U(O
MX6'G"-=7:2G=I],I?'1^O19V=],MS:!$A4M!R*%8 at M2 UAH+%FMCB<'R7OQT
M"%#[A9)%A[ QLH3/(?P^1J,=.[*!$!-V8HD94SI*Y]%AY14\D*^JTXD="L6<
M"R6<:[38I0V-&F\R#9?G*VRD at ENLI&8LC5M0_ 9,O"O^$(\>E\)H1TT4?,/M
MUP!R#:,G^Z1'5]WVLXC=&OV!`#=HH1!*`:VD.X>*E1ON0RO%.(/GE[_,?">L
M0P>?#'_4)<0J9G;IUZC)Y4.,U&H'PB(83[4G,)I#M3,*\_BQ)=VUMX4.R"WP
MC%BVA2=.3"8H2=8HJ)E*$'.!*[&1QMLS%(CK'"C6$*;D>B1:[J.;V&Y1D!<*
M7I=SAHG[CX&4Z'@2!$FC&QB+SJLP'9$EEF<`6B1OM;L!LAY!5J -8!)PBZQ@
MB80%81D`FKUO7>9($#\6QJC4JCUJNG;H?OSL:$W +'XQ/O1JR1+\Z[QT5\I_
M)$.'VP><A/'YXP`8VN&[E80!*LMZ,_%/3?H_>ZX/:)N.-&@]?*B,39C)D._(
MPZ<L/!FZ#=HB#UM[3[)(@A5(C^M at XL/;QKWL^1>D^:[&<3;I,E_M&Z4&/(\8
M!Z9G,!%GS<%]DA@$FUPLVW]6;&>1^*=_69NOM?>[.96#>(T?B5_!5/RKZ_C&
MQ*5TM1([\*'$4-MI=]ZQ#"06JE4DDA=2AU?!0-SERDK4I=J%!A16UJ$!G'Z_
M;NX</S>I]IDY=F<\#Q7V*S]Y_HZ/.[&/Q4>O5RK+\IAKZ*3F\?(;4$L!`A0`
M% ````@`R$V^,$Z*RI[!````- at 0```<````````````@`````````$%P<"YI
M8V]02P$"% `4````" #(3;XP0U6H7:T#``!Z"0``#P```````````" ```#F
M````07-S96UB;'E);F9O+F-S4$L!`A0`% ````@`R$V^,)A2F5K3````8 $`
M``D````````````@````P 0``$-L87-S,2YC<U!+`0(4`!0````(`/%P*"[9
MWRK$?1,``/AV```7````````````( ```+H%``!#;VUM86YD3&EN94%R9W5M
M96YT<RYC<U!+`0(4`!0````(`-Q-OC!?7>'F5@,``$$0```8````````````
M( ```&P9``!C;VUM86YD;&EN97!A<G-E<BYC<W!R;VI02P$"% `4````" `K
M4[XP_[=WX%0!``#L!@``'0```````````" ```#X' ``8V]M;6%N9&QI;F5P
M87)S97(N8W-P<F]J+G5S97)02P$"% `4````" #(3;XP`$;&]U0!``"B`P``
M%0```````````" ```"''@``8V]M;6%N9&QI;F5P87)S97(N<VQN4$L!`A0`
M% ````@`JE&^,#UW8T^4`0``J@,```<````````````@````#B ``&UA:6XN
M8W-02P$"% `4````" #E<"@NQ7,,NWL%```2$0``"@```````````" ```#'
M(0``<F5A9&UE+G1X=%!+`0(4`!0````(`)U90BW6[193F (``#@*```*````
M````````( ```&HG``!5=&EL:71Y+F-S4$L%!@`````*``H`9P(``"HJ````
!````
`
end




More information about the Digitalmars-d mailing list