|
Boost : |
From: Robert Ramey (ramey_at_[hidden])
Date: 2005-11-08 12:34:47
>> I work on www.webEbenezer.net. I noticed today that Robert
>> Ramey said "So far so good" regarding some performance tests
>> he is doing. You might want to encourage him to consider
>> some of the competition as far as performance.
>> Some recent tests I've done that compare Ebenezer Enterprises
>> and Boost.serialization's performance show the
>> Boost.serialization approach to be 7 to 9 times slower than the
>> Ebenezer Enterprises approach. I'm using Linux 2.6.12,
>> gcc 4.0.2 (with -O3) and a Boost.serialization library from the
>> release tree. A test that compared the times to serialize/send
>> a list<int> took 7.4 times longer with Boost than Ebenezer.
>> I timed the following
>> Boost:
>> oArch & lst; // oArch is a binary_oarchive
>>
>> Ebenezer:
>> msgs.Send(buffer, lst); // In order to compare apples to
>> apples, // I removed a section of code
>> at the end
>>
>> // of the Send function that flushes
>> the buffer.
>>
>>
>> In a second test I added a deque of int...
>> Boost:
>> oArch & lst;
>> oArch & dq; // std::deque<int> dq;
>>
>> Ebenezer:
>> msgs.Send(buffer, lst, dq);
>>
>> In this case Boost took 9.1 times longer than Ebenezer Enterprises
>> approach. If you want to run these tests with other compilers I
>> think that would be helpful. I've been warned not to put too much
>> emphasis on numbers from gcc.
I've written a test program to compare the time required by boost
serialization
to the time required by using stream i/o to do a similar operation. I've
only
used VC 7.1 (release mode) and my focus has been to try to determine how
much overhead
the serialization system adds compared to the alternative of not using it.
The
test consists for saving/loading 1000 instances of a class which includes
all primitive types (? about 20 members including strings). Times are
calculated
by dividing the total time by 1000 to give ms / operaton.
These preliminary results don't raise any major red flags.
I'm still working on this in my spare time. A couple of problems are:
a) timings are too crude.
b) I need to make a standard library test which writes/read binary data.
This is interesting for comparison purposes, though I doubt many people
actually use output/input streams in this way.
c) I'm aware that there are couple of opportunities for improved
performance in the archive implementation.
d)I really want to get profile data from this (improved) test. I'm having
some problems because not all plaforms support profiling and I'm
having some problems figuring out how to work into bjam in the way
I want.
e)If I've got nothing else to do, I might want to enhance this with tests of
some stl collections.
Note that the compiled version of the attached program using the
static library of the serialization library and the DLL version of the
VC C++ runtime library is 268K. Given what we're serializing
to three different archives, including xml, this seems like a very
reasonable number to me.
Below are a couple of test runs.
Robert Ramey
standard library
write to file 0.047ms
read from file 0.016ms
binary_archives
save archive 0ms
save archive through pointer 0.015ms
load archive 0.016ms
load archive through pointer 0.016ms
text_archives
save archive 0.062ms
save archive through pointer 0.047ms
load archive 0.046ms
load archive through pointer 0.079ms
xml_archives
save archive 0.11ms
save archive through pointer 0.156ms
load archive 0.187ms
load archive through pointer 0.203ms
*** No errors detected
Running 1 test case...
standard library
write to file 0.062ms
read from file 0.016ms
binary_archives
save archive 0.016ms
save archive through pointer 0.015ms
load archive 0.016ms
load archive through pointer 0.031ms
text_archives
save archive 0.094ms
save archive through pointer 0.078ms
load archive 0.078ms
load archive through pointer 0.093ms
xml_archives
save archive 0.125ms
save archive through pointer 0.141ms
load archive 0.172ms
load archive through pointer 0.219ms
*** No errors detected
Press any key to continue
Running 1 test case...
standard library
write to file 0.047ms
read from file 0ms
binary_archives
save archive 0.016ms
save archive through pointer 0.015ms
load archive 0ms
load archive through pointer 0.016ms
text_archives
save archive 0.063ms
save archive through pointer 0.062ms
load archive 0.063ms
load archive through pointer 0.093ms
xml_archives
save archive 0.125ms
save archive through pointer 0.157ms
load archive 0.187ms
load archive through pointer 0.219ms
*** No errors detected
Press any key to continue
begin 666 test_overhead.cpp
M+R\O+R\O+R\O,2\O+R\O+R\O+S(O+R\O+R\O+R\S+R\O+R\O+R\O-"\O+R\O
M+R\O+S4O+R\O+R\O+R\V+R\O+R\O+R\O-R\O+R\O+R\O+S_at_-"B\O('1E<W1?
M;W9E<FAE860N8W!P#0H-"B\O("A#*2!#;W!Y<FEG:'0@,C P-2!2;V)E<G0@
M4F%M97D@+2!H='1P.B\O=W=W+G)R<V0N8V]M("X@#0HO+R!5<V4L(&UO9&EF
M:6-A=&EO;B!A;F0_at_9&ES=')I8G5T:6]N(&ES('-U8FIE8W0@=&\@=&AE($)O
M;W-T(%-O9G1W87)E#0HO+R!,:6-E;G-E+"!697)S:6]N(#$N,"X@*%-E92!A
M8V-O;7!A;GEI;F<@9FEL92!,24-%3E-%7S%?,"YT>'0@;W(@8V]P>2!A= T*
M+R\@:'1T<#HO+W=W=RYB;V]S="YO<F<O3$E#14Y315\Q7S N='AT*0T*#0HO
M+R!S:&]U;&0@<&%S<R!C;VUP:6QA=&EO;B!A;F0_at_97AE8W5T:6]N#0H-"B\O
M(&EN=F]K92!H96%D97(@9F]R(&$@8W5S=&]M(&%R8VAI=F4@=&5S="X-"@T*
M(VEN8VQU9&4@/&9S=')E86T^#0HC:6YC;'5D92 \:6]S=')E86T^#0H-"B-I
M;F-L=61E(#QC<W1D:6\^("\O(')E;6]V90T*(VEN8VQU9&4@/&)O;W-T+V-O
M;F9I9RYH<' ^#0H-"B-I9B!D969I;F5D*$)/3U-47TY/7U-41$-?3D%-15-0
M04-%*0T*;F%M97-P86-E('-T9'L@#0H@(" @=7-I;F<@.CIR96UO=F4[#0I]
M#0HC96YD:68-"@T*(VEN8VQU9&4@/&)O;W-T+W1I;65R+FAP<#X-"@T*(VEN
M8VQU9&4@(G1E<W1?=&]O;',N:'!P(@T*(VEN8VQU9&4@/&)O;W-T+V%R8VAI
M=F4O8FEN87)Y7V]A<F-H:79E+FAP<#X-"B-I;F-L=61E(#QB;V]S="]A<F-H
M:79E+V)I;F%R>5]I87)C:&EV92YH<' ^#0HC:6YC;'5D92 \8F]O<W0O87)C
M:&EV92]T97AT7V]A<F-H:79E+FAP<#X-"B-I;F-L=61E(#QB;V]S="]A<F-H
M:79E+W1E>'1?:6%R8VAI=F4N:'!P/@T*(VEN8VQU9&4@/&)O;W-T+V%R8VAI
M=F4O>&UL7V]A<F-H:79E+FAP<#X-"B-I;F-L=61E(#QB;V]S="]A<F-H:79E
M+WAM;%]I87)C:&EV92YH<' ^#0H-"B-I;F-L=61E(#QB;V]S="]S97)I86QI
M>F%T:6]N+VYV<"YH<' ^#0H-"B-I;F-L=61E(#QB;V]S="]P<F5P<F]C97-S
M;W(O<W1R:6YG:7IE+FAP<#X-"B-I;F-L=61E($)/3U-47U!07U-44DE.1TE:
M12A"3T]35%]!4D-(259%7U1%4U0I#0H-"B-I;F-L=61E(")!+FAP<"(-"@T*
M:6YL:6YE('-T9#HZ;W-T<F5A;2 F(&]P97)A=&]R/#PH<W1D.CIO<W1R96%M
M("8@;W,L($$@8V]N<W0@)B!A*2![#0H@(" @;W,@/#P_at_82YB/#P@(EQN(CL-
M"B @(" C:69N9&5F($)/3U-47TY/7TE.5#8T7U0-"B @("!O<R \/"!A+F8\
M/" B7&XB.PT*(" @(&]S(#P\(&$N9SP\(")<;B([#0H@(" @(V5N9&EF#0H@
M(" @;W,@/#P_at_82YL/#P@(EQN(CL-"B @("!O<R \/"!A+FT\/" B7&XB.PT*
M(" @(&]S(#P\(&$N;CP\(")<;B([#0H@(" @;W,@/#P_at_82YO/#P@(EQN(CL-
M"B @("!O<R \/"!A+G \/" B7&XB.PT*(" @(&]S(#P\(&$N<3P\(")<;B([
M#0H@(" @(VEF;F1E9B!"3T]35%].3U]#5T-(05(-"B @("!O<R \/"!A+G(\
M/" B7&XB.PT*(" @("-E;F1I9_at_T*(" @(&]S(#P\(&$N8SP\(")<;B([#0H@
M(" @;W,@/#P_at_82YS/#P@(EQN(CL-"B @("!O<R \/"!A+G0\/" B7&XB.PT*
M(" @(&]S(#P\(&$N=3P\(")<;B([#0H@(" @;W,@/#P_at_82YV/#P@(EQN(CL-
M"B @("!O<R \/"!A+G<\/" B7&XB.PT*(" @(&]S(#P\(&$N>#P\(")<;B([
M#0H@(" @;W,@/#P_at_82YY/#P@(EQN(CL-"B @(" C:69N9&5F($)/3U-47TY/
M7U-41%]74U1224Y'#0H@(" @+R]O<R \/"!A+GH\/" B7&XB.PT*(" @("-E
M;F1I9_at_T*(" @(')E='5R;B!O<SL-"GT-"@T*:6YL:6YE('-T9#HZ:7-T<F5A
M;2 F(&]P97)A=&]R/CXH<W1D.CII<W1R96%M("8@:7,L($$@)B!A*2![#0H@
M(" @:7,@/CX_at_[hidden]*(" @("-I9FYD968_at_0D]/4U1?3D]?24Y4-C1?5 T*
M(" @(&ES(#X^(&$N9CL-"B @("!I<R ^/B!A+F<[#0H@(" @(V5N9&EF#0H@
M(" @:6YT(&D[#0H@(" @:7,@/CX@:3L-"B @("!A+FP@/2!S=&%T:6-?8V%S
M=#Q!.CIH/BAI*3L-"B @("!I<R ^/B!A+FT[#0H@(" @:7,@/CX_at_[hidden]*
M(" @(&ES(#X^(&$N;SL-"B @("!I<R ^/B!A+G [#0H@(" @:7,@/CX_at_82YQ
M.PT*(" @("-I9FYD968_at_0D]/4U1?3D]?0U=#2$%2#0H@(" @:7,@/CX@:3L-
M"B @("!A+G(@/2!I.PT*(" @("-E;F1I9_at_T*(" @(&ES(#X^(&$N8SL-"B @
M("!I<R ^/B!A+G,[#0H@(" @:7,@/CX_at_[hidden]*(" @(&ES(#X^(&$N=3L-
M"B @("!I<R ^/B!A+G8[#0H@(" @:7,@/CX_at_[hidden]*(" @(&ES(#X^(&$N
M>#L-"B @("!I<R ^/B!A+GD[#0H@(" @(VEF;F1E9B!"3T]35%].3U]35$1?
M5U-44DE.1PT*(" @("\O:7,@/CX_at_[hidden]*(" @("-E;F1I9_at_T*(" @(')E
M='5R;B!I<SL-"GT-"@T*+R\@:G5S="!U<V4_at_82!W<F%P<&5R('-O('1H870@
M02!D;V5S;B=T(&=E="!T<F%C:V5D#0IC;&%S<R!T<F%C:V5D7T$@.B!P=6)L
M:6,@02![#0H@(" @9G)I96YD(&)O;W-T.CIS97)I86QI>F%T:6]N.CIA8V-E
M<W,[#0H@(" @=&5M<&QA=&4\8VQA<W,@07)C:&EV93X-"B @("!V;VED('-E
M<FEA;&EZ92A!<F-H:79E("8_at_87(L(&-O;G-T('5N<VEG;F5D(&EN="!V97)S
M:6]N*7L-"B @(" @(" @87(@)B!"3T]35%]315))04Q)6D%424].7T)!4T5?
M3T)*14-47TY64"A!*3L-"B @("!]#0I].PT*#0HO+R!B87-E;&EN92 M(&9I
M9W5R92!T:6UE('1O(&IU<W0@=W)I=&4@=&AE(&1A=&$@#0IT96UP;&%T93QU
M;G-I9VYE9"!I;G0_at_3CX-"G9O:60@<V%V95]T97-T,2AS=&0Z.F]S=')E86T@
M)B!O<RP_at_8V]N<W0_at_02 H)B!A*5M.72E[#0H@(" @;W,N9FQU<V_at_H*3L-"B @
M("!B;V]S=#HZ=&EM97(@=#L-"B @("!U;G-I9VYE9"!I;G0@:2 ]($X[#0H@
M(" @=VAI;&4H:2TM(#X@,"D-"B @(" @(" @;W,@/#P_at_85MI72 \/" B7&XB
M.PT*(" @('-T9#HZ8V]U=" \/" B=W)I=&4@=&\@9FEL92 B(#P\('0N96QA
M<'-E9"@I(#P\(")M<UQN(CL-"GT-"@T*+R\@<V%V92!D871A('5S:6YG(&%N
M(&%R8VAI=F4-"G1E;7!L871E/&-L87-S($%R8VAI=F4L('5N<VEG;F5D(&EN
M="!./@T*=F]I9"!S879E7W1E<W0R*$%R8VAI=F4@)B!O82P_at_8V]N<W0_at_02 H
M)B!A*5M.72E[#0H@(" @8F]O<W0Z.G1I;65R('0[#0H@(" @;V$@/#P_at_0D]/
M4U1?4T5224%,25I!5$E/3E].5E H82D[#0H@(" @<W1D.CIC;W5T(#P\(")S
M879E(&%R8VAI=F4@(B \/"!T+F5L87!S960H*2 \/" B;7-<;B([#0I]#0H-
M"B\O('-A=F4_at_9&%T82!T:')O=6=H(&$@<&]I;G1E<B!U<VEN9R!A;B!A<F-H
M:79E#0IT96UP;&%T93QC;&%S<R!!<F-H:79E+"!U;G-I9VYE9"!I;G0_at_3CX-
M"G9O:60@<V%V95]T97-T,RA!<F-H:79E("8@;V$L(&-O;G-T($$@*"8_at_82E;
M3ETI>PT*(" @('1R86-K961?02!C;VYS=" J(&%P6TY=.PT*(" @('5N<VEG
M;F5D(&EN="!I(#T_at_3CL-"B @("!W:&EL92AI+2T@/B P*0T*(" @(" @("!A
M<%MI72 ]('-T871I8U]C87-T/'1R86-K961?02!C;VYS=" J/B_at_F(&%;:5TI
M.PT*(" @(&)O;W-T.CIT:6UE<B!T.PT*(" @(&]A("8_at_0D]/4U1?4T5224%,
M25I!5$E/3E].5E H87 I.PT*(" @('-T9#HZ8V]U=" \/" B<V%V92!A<F-H
M:79E('1H<F]U9V@@<&]I;G1E<B B(#P\('0N96QA<'-E9"@I(#P\(")M<UQN
M(CL-"GT-"@T*+R\@8F%S96QI;F4@+2!F:6=U<F4@=&EM92!T;R!J=7-T('=R
M:71E('1H92!D871A( T*=&5M<&QA=&4\=6YS:6=N960@:6YT($X^#0IV;VED
M(&QO861?=&5S=#$H<W1D.CII<W1R96%M("8@:7,L($$@*"8_at_82E;3ETI>PT*
M(" @(&)O;W-T.CIT:6UE<B!T.PT*(" @('5N<VEG;F5D(&EN="!I(#T_at_3CL-
M"B @("!W:&EL92AI+2T@/B P*0T*(" @(" @("!I<R ^/B!A6VE=.PT*(" @
M('-T9#HZ8V]U=" \/" B<F5A9"!F<F]M(&9I;&4@(B \/"!T+F5L87!S960H
M*2 \/" B;7-<;B([#0I]#0H-"B\O(&QO860_at_9&%T82!U<VEN9R!A;B!A<F-H
M:79E#0IT96UP;&%T93QC;&%S<R!!<F-H:79E+"!U;G-I9VYE9"!I;G0_at_3CX-
M"G9O:60@;&]A9%]T97-T,BA!<F-H:79E("8@:6$L($$@*"8_at_82E;3ETI>PT*
M(" @(&)O;W-T.CIT:6UE<B!T.PT*(" @(&EA(#X^($)/3U-47U-%4DE!3$E:
M051)3TY?3E90*&$I.PT*(" @('-T9#HZ8V]U=" \/" B;&]A9"!A<F-H:79E
M("(@/#P@="YE;&%P<V5D*"D@/#P@(FUS7&XB.PT*?0T*#0HO+R!L;V%D(&1A
M=&$@=&AR;W5G:"!A('!O:6YT97(@=7-I;F<@86X_at_87)C:&EV90T*=&5M<&QA
M=&4\8VQA<W,@07)C:&EV92P@=6YS:6=N960@:6YT($X^#0IV;VED(&QO861?
M=&5S=#,H07)C:&EV92 F(&EA+"!!("@F(&$I6TY=*7L-"B @("!T<F%C:V5D
M7T$@*B!A<%M.73L-"B @("!B;V]S=#HZ=&EM97(@=#L-"B @("!I82 ^/B!"
M3T]35%]315))04Q)6D%424].7TY64"AA<"D[#0H@(" @<W1D.CIC;W5T(#P\
M(")L;V%D(&%R8VAI=F4@=&AR;W5G:"!P;VEN=&5R("(@/#P@="YE;&%P<V5D
M*"D@/#P@(FUS7&XB.PT*(" @("\O(&IU<W0@:6X_at_8V%S92!S;VUE;VYE('=A
M;G1E9"!T;R!C;VUP87)E('1H92!R97-U;'1S#0H@(" @=6YS:6=N960@:6YT
M(&D@/2!..PT*(" @('=H:6QE*&DM+2 ^(# I#0H@(" @(" @(&%;:5T@/2 J
M87!;:5T[#0H@(" @:6$N9&5L971E7V-R96%T961?<&]I;G1E<G,H*3L-"GT-
M"@T*=&5M<&QA=&4\=6YS:6=N960@:6YT($X^#0IV;VED('1E<W1?<W1R96%M
M*$$@*"8_at_82E;3ETI>PT*(" @('-T9#HZ8V]U=" \/" B<W1A;F1A<F0@;&EB
M<F%R>5QN(CL-"B @("!C;VYS="!C:&%R("H@=&5S=&9I;&4@/2!B;V]S=#HZ
M87)C:&EV93HZ=&UP;F%M*$Y53$PI.PT*(" @($)/3U-47U)%455)4D4H3E5,
M3" A/2!T97-T9FEL92D[#0H@(" @=&5S=%]O<W1R96%M(&]S*'1E<W1F:6QE
M+"!415-47U-44D5!35]&3$%'4RD[#0H@(" @<V%V95]T97-T,2AO<RP_at_82D[
M#0H@(" @;W,N8VQO<V4H*3L-"B @("!T97-T7VES=')E86T@:7,H=&5S=&9I
M;&4L(%1%4U1?4U1214%-7T9,04=3*3L-"B @("!L;V%D7W1E<W0Q*&ES+"!A
M*3L-"B @("!I<RYC;&]S92_at_[hidden]*(" @('-T9#HZ<F5M;W9E*'1E<W1F:6QE
M*3L-"GT-"@T*=&5M<&QA=&4\=6YS:6=N960@:6YT($X^#0IV;VED('1E<W1?
M8FEN87)Y7V%R8VAI=F4H02 H)B!A*5M.72E[#0H@(" @<W1D.CIC;W5T(#P\
M(")B:6YA<GE?87)C:&EV97-<;B([#0H@(" @8V]N<W0_at_8VAA<B J('1E<W1F
M:6QE(#T_at_8F]O<W0Z.F%R8VAI=F4Z.G1M<&YA;2A.54Q,*3L-"B @("!"3T]3
M5%]215%525)%*$Y53$P@(3T@=&5S=&9I;&4I.PT*(" @('-T9#HZ;V9S=')E
M86T@;W,H=&5S=&9I;&4L('-T9#HZ:6]S.CIB:6YA<GDI.PT*(" @(&)O;W-T
M.CIA<F-H:79E.CIB:6YA<GE?;V%R8VAI=F4@;V$H;W,I.PT*(" @('-A=F5?
M=&5S=#(H;V$L(&$I.PT*(" @(&]S+F9L=7-H*"D[#0H@(" @<V%V95]T97-T
M,RAO82P_at_82D[#0H@(" @;W,N8VQO<V4H*3L-"B @("!S=&0Z.FEF<W1R96%M
M(&ES*'1E<W1F:6QE+"!S=&0Z.FEO<SHZ8FEN87)Y*3L-"B @("!B;V]S=#HZ
M87)C:&EV93HZ8FEN87)Y7VEA<F-H:79E(&EA*&ES*3L-"B @("!L;V%D7W1E
M<W0R*&EA+"!A*3L-"B @("!L;V%D7W1E<W0S*&EA+"!A*3L-"B @("!S=&0Z
M.G)E;6]V92AT97-T9FEL92D[#0I]#0H-"G1E;7!L871E/'5N<VEG;F5D(&EN
M="!./@T*=F]I9"!T97-T7W1E>'1?87)C:&EV92A!("@F(&$I6TY=*7L-"B @
M("!S=&0Z.F-O=70@/#P@(G1E>'1?87)C:&EV97-<;B([#0H@(" @8V]N<W0@
M8VAA<B J('1E<W1F:6QE(#T_at_8F]O<W0Z.F%R8VAI=F4Z.G1M<&YA;2A.54Q,
M*3L-"B @("!"3T]35%]215%525)%*$Y53$P@(3T@=&5S=&9I;&4I.PT*(" @
M('-T9#HZ;V9S=')E86T@;W,H=&5S=&9I;&4I.PT*(" @(&)O;W-T.CIA<F-H
M:79E.CIT97AT7V]A<F-H:79E(&]A*&]S*3L-"B @("!S879E7W1E<W0R*&]A
M+"!A*3L-"B @("!O<RYF;'5S:"@I.PT*(" @('-A=F5?=&5S=#,H;V$L(&$I
M.PT*(" @(&]S+F-L;W-E*"D[#0H@(" @<W1D.CII9G-T<F5A;2!I<RAT97-T
M9FEL92D[#0H@(" @8F]O<W0Z.F%R8VAI=F4Z.G1E>'1?:6%R8VAI=F4@:6$H
M:7,I.PT*(" @(&QO861?=&5S=#(H:6$L(&$I.PT*(" @(&QO861?=&5S=#,H
M:6$L(&$I.PT*(" @('-T9#HZ<F5M;W9E*'1E<W1F:6QE*3L-"GT-"@T*=&5M
M<&QA=&4\=6YS:6=N960@:6YT($X^#0IV;VED('1E<W1?>&UL7V%R8VAI=F4H
M02 H)B!A*5M.72E[#0H@(" @<W1D.CIC;W5T(#P\(")X;6Q?87)C:&EV97-<
M;B([#0H@(" @8V]N<W0_at_8VAA<B J('1E<W1F:6QE(#T_at_8F]O<W0Z.F%R8VAI
M=F4Z.G1M<&YA;2A.54Q,*3L-"B @("!"3T]35%]215%525)%*$Y53$P@(3T@
M=&5S=&9I;&4I.PT*(" @('-T9#HZ;V9S=')E86T@;W,H=&5S=&9I;&4I.PT*
M(" @(&)O;W-T.CIA<F-H:79E.CIX;6Q?;V%R8VAI=F4@;V$H;W,I.PT*(" @
M('-A=F5?=&5S=#(H;V$L(&$I.PT*(" @(&]S+F9L=7-H*"D[#0H@(" @<V%V
M95]T97-T,RAO82P_at_82D[#0H@(" @;W,N8VQO<V4H*3L-"B @("!S=&0Z.FEF
M<W1R96%M(&ES*'1E<W1F:6QE*3L-"B @("!B;V]S=#HZ87)C:&EV93HZ>&UL
M7VEA<F-H:79E(&EA*&ES*3L-"B @("!L;V%D7W1E<W0R*&EA+"!A*3L-"B @
M("!L;V%D7W1E<W0S*&EA+"!A*3L-"B @("!S=&0Z.G)E;6]V92AT97-T9FEL
M92D[#0I]#0H-"FEN=" -"G1E<W1?;6%I;B@@:6YT("\J(&%R9V,@*B\L(&-H
M87(J("\J(&%R9W8@*B];72 I#0I[#0H@(" @02!A6S$P,#!=.PT*(" @('1E
M<W1?<W1R96%M*&$I.PT*(" @('1E<W1?8FEN87)Y7V%R8VAI=F4H82D[#0H@
M(" @=&5S=%]T97AT7V%R8VAI=F4H82D[#0H@(" @=&5S=%]X;6Q?87)C:&EV
D92AA*3L-"B @("!R971U<FX_at_15A)5%]354-#15-3.PT*?0T*
`
end
begin 666 A.hpp
M(VEF;F1E9B!"3T]35%]315))04Q)6D%424].7U1%4U1?05](4% -"B-D969I
M;F4_at_0D]/4U1?4T5224%,25I!5$E/3E]415-47T%?2%!0#0H-"B\O($U3(&-O
M;7!A=&EB;&4_at_8V]M<&EL97)S('-U<'!O<G0@(W!R86=M82!O;F-E#0HC:68@
M9&5F:6YE9"A?35-#7U9%4BD@)B8@*%]-4T-?5D52(#X](#$P,C I#0HC('!R
M86=M82!O;F-E#0HC96YD:68-"@T*+R\O+R\O+R\O,2\O+R\O+R\O+S(O+R\O
M+R\O+R\S+R\O+R\O+R\O-"\O+R\O+R\O+S4O+R\O+R\O+R\V+R\O+R\O+R\O
M-R\O+R\O+R\O+S_at_-"B\O($$N:'!P(" @('-I;7!L92!C;&%S<R!T97-T#0H-
M"B\O("A#*2!#;W!Y<FEG:'0@,C P,B!2;V)E<G0_at_4F%M97D@+2!H='1P.B\O
M=W=W+G)R<V0N8V]M("X@#0HO+R!5<V4L(&UO9&EF:6-A=&EO;B!A;F0_at_9&ES
M=')I8G5T:6]N(&ES('-U8FIE8W0@=&\@=&AE($)O;W-T(%-O9G1W87)E#0HO
M+R!,:6-E;G-E+"!697)S:6]N(#$N,"X@*%-E92!A8V-O;7!A;GEI;F<@9FEL
M92!,24-%3E-%7S%?,"YT>'0@;W(@8V]P>2!A= T*+R\@:'1T<#HO+W=W=RYB
M;V]S="YO<F<O3$E#14Y315\Q7S N='AT*0T*#0HO+R @4V5E(&AT=' Z+R]W
M=W<N8F]O<W0N;W)G(&9O<B!U<&1A=&5S+"!D;V-U;65N=&%T:6]N+"!A;F0@
M<F5V:7-I;VX@:&ES=&]R>2X-"@T*(VEN8VQU9&4@/&-A<W-E<G0^#0HC:6YC
M;'5D92 \8W-T9&QI8CX@+R\@9F]R(')A;F0H*0T*(VEN8VQU9&4@/&-M871H
M/B O+R!F;W(@9F%B<R_at_I#0HC:6YC;'5D92 \8W-T9&1E9CX@+R\@<VEZ95]T
M#0H-"B-I;F-L=61E(#QB;V]S="]C;VYF:6<N:'!P/@T*(VEF(&1E9FEN960H
M0D]/4U1?3D]?4U1$0U].04U%4U!!0T4I#0IN86UE<W!A8V4@<W1D>PT*(" @
M('5S:6YG(#HZ<F%N9#L@#0H@(" @=7-I;F<@.CIF86)S.PT*(" @('5S:6YG
M(#HZ<VEZ95]T.PT*?0T*(V5N9&EF#0H-"B-I;F-L=61E(#QB;V]S="]T97-T
M+W1E<W1?=&]O;',N:'!P/@T*(VEN8VQU9&4@/&)O;W-T+VQI;6ET<RYH<' ^
M#0HC:6YC;'5D92 \8F]O<W0O8W-T9&EN="YH<' ^#0H-"B-I;F-L=61E(#QB
M;V]S="]D971A:6PO=V]R:V%R;W5N9"YH<' ^#0HC:68_at_0D]/4U1?5T]22T%2
M3U5.1"A"3T]35%]$24Y+54U705)%7U-41$Q)0BP@/3T@,2D-"B-I;F-L=61E
M(#QB;V]S="]A<F-H:79E+V1I;FMU;7=A<F4N:'!P/@T*(V5N9&EF#0H-"B-I
M;F-L=61E(#QB;V]S="]S97)I86QI>F%T:6]N+VYV<"YH<' ^#0HC:6YC;'5D
M92 \8F]O<W0O<V5R:6%L:7IA=&EO;B]S=')I;F<N:'!P/@T*(VEN8VQU9&4@
M/&)O;W-T+W-E<FEA;&EZ871I;VXO86-C97-S+FAP<#X-"@T*8VQA<W,@00T*
M>PT*<')I=F%T93H-"B @("!F<FEE;F0_at_8VQA<W,@8F]O<W0Z.G-E<FEA;&EZ
M871I;VXZ.F%C8V5S<SL-"B @(" O+R!N;W1E.B!F<F]M(&%N(&%E<W1H971I
M8R!P97)S<&5C=&EV92P_at_22!W;W5L9"!M=6-H('!R969E<B!T;R!H879E('1H
M:7,-"B @(" O+R!D969I;F5D(&]U="!O9B!L:6YE+B @56YF;W)T=6YA=&5L
M>2P@=&AI<R!T<FEP<R!A(&)U9R!I;B!T:&4_at_5D,@-BXP#0H@(" @+R\@8V]M
M<&EL97(N(%-O(&AO;&0@;W5R(&YO<V4_at_86YD('!U="!I="!H97(@=&\@<&5R
M;6ET(')U;FYI;F<@;V8@=&5S=',N#0H@(" @=&5M<&QA=&4\8VQA<W,@07)C
M:&EV93X-"B @("!V;VED('-E<FEA;&EZ92_at_-"B @(" @(" @07)C:&EV92 F
M87(L#0H@(" @(" @(&-O;G-T('5N<VEG;F5D(&EN=" O*B!F:6QE7W9E<G-I
M;VX@*B\-"B @(" I>PT*(" @(" @("!A<B F($)/3U-47U-%4DE!3$E:051)
M3TY?3E90*&(I.PT*(" @(" @(" C:69N9&5F($)/3U-47TY/7TE.5#8T7U0-
M"B @(" @(" @87(@)B!"3T]35%]315))04Q)6D%424].7TY64"AF*3L-"B @
M(" @(" @87(@)B!"3T]35%]315))04Q)6D%424].7TY64"AG*3L-"B @(" @
M(" @(V5N9&EF#0H@(" @(" @("-I9B!"3T]35%]73U)+05)/54Y$*%]?0D]2
M3$%.1$-?7RP@(#P](#!X-34Q("D-"B @(" @(" @(" @(&EN="!I.PT*(" @
M(" @(" @(" @:68H07)C:&EV93HZ:7-?<V%V:6YG.CIV86QU92E[#0H@(" @
M(" @(" @(" @(" @:2 ](&P[#0H@(" @(" @(" @(" @(" @87(@)B!"3T]3
M5%]315))04Q)6D%424].7TY64"AI*3L-"B @(" @(" @(" @('T-"B @(" @
M(" @(" @(&5L<V5[#0H@(" @(" @(" @(" @(" @87(@)B!"3T]35%]315))
M04Q)6D%424].7TY64"AI*3L-"B @(" @(" @(" @(" @("!L(#T@:3L-"B @
M(" @(" @(" @('T-"B @(" @(" @(V5L<V4-"B @(" @(" @(" @(&%R("8@
M0D]/4U1?4T5224%,25I!5$E/3E].5E H;"D[#0H@(" @(" @("-E;F1I9_at_T*
M(" @(" @("!A<B F($)/3U-47U-%4DE!3$E:051)3TY?3E90*&TI.PT*(" @
M(" @("!A<B F($)/3U-47U-%4DE!3$E:051)3TY?3E90*&XI.PT*(" @(" @
M("!A<B F($)/3U-47U-%4DE!3$E:051)3TY?3E90*&\I.PT*(" @(" @("!A
M<B F($)/3U-47U-%4DE!3$E:051)3TY?3E90*' I.PT*(" @(" @("!A<B F
M($)/3U-47U-%4DE!3$E:051)3TY?3E90*'$I.PT*(" @(" @(" C:69N9&5F
M($)/3U-47TY/7T-70TA!4_at_T*(" @(" @("!A<B F($)/3U-47U-%4DE!3$E:
M051)3TY?3E90*'(I.PT*(" @(" @(" C96YD:68-"B @(" @(" @87(@)B!"
M3T]35%]315))04Q)6D%424].7TY64"AC*3L-"B @(" @(" @87(@)B!"3T]3
M5%]315))04Q)6D%424].7TY64"AS*3L-"B @(" @(" @87(@)B!"3T]35%]3
M15))04Q)6D%424].7TY64"AT*3L-"B @(" @(" @87(@)B!"3T]35%]315))
M04Q)6D%424].7TY64"AU*3L-"B @(" @(" @87(@)B!"3T]35%]315))04Q)
M6D%424].7TY64"AV*3L-"B @(" @(" @87(@)B!"3T]35%]315))04Q)6D%4
M24].7TY64"AW*3L-"B @(" @(" @87(@)B!"3T]35%]315))04Q)6D%424].
M7TY64"AX*3L-"B @(" @(" @87(@)B!"3T]35%]315))04Q)6D%424].7TY6
M4"AY*3L-"B @(" @(" @(VEF;F1E9B!"3T]35%].3U]35$1?5U-44DE.1PT*
M(" @(" @("!A<B F($)/3U-47U-%4DE!3$E:051)3TY?3E90*'HI.PT*(" @
M(" @(" C96YD:68-"B @("!]#0H@(" @8F]O;"!B.PT*(" @("-I9FYD968@
M0D]/4U1?3D]?24Y4-C1?5 T*(" @(&)O;W-T.CII;G0V-%]T(&8[#0H@(" @
M8F]O<W0Z.G5I;G0V-%]T(&<[#0H@(" @(V5N9&EF#0H@(" @96YU;2!H('L-
M"B @(" @(" @:2 ](# L#0H@(" @(" @(&HL#0H@(" @(" @(&L-"B @("!]
M(&P[#0H@(" @<W1D.CIS:7IE7W0@;3L-"B @("!S:6=N960@;&]N9R!N.PT*
M(" @('5N<VEG;F5D(&QO;F<@;SL-"B @("!S:6=N960@('-H;W)T(' [#0H@
M(" @=6YS:6=N960@<VAO<G0@<3L-"B @(" C:69N9&5F($)/3U-47TY/7T-7
M0TA!4_at_T*(" @('=C:&%R7W0@<CL-"B @(" C96YD:68-"B @("!C:&%R(&,[
M#0H@(" @<VEG;F5D(&-H87(@<SL-"B @("!U;G-I9VYE9"!C:&%R('0[#0H@
M(" @<VEG;F5D(&EN="!U.PT*(" @('5N<VEG;F5D(&EN="!V.PT*(" @(&9L
M;V%T('<[#0H@(" @9&]U8FQE('@[#0H@(" @<W1D.CIS=')I;F<@>3L-"B @
M(" C:69N9&5F($)/3U-47TY/7U-41%]74U1224Y'#0H@(" @<W1D.CIW<W1R
M:6YG('H[#0H@(" @(V5N9&EF#0IP=6)L:6,Z#0H@(" @02_at_[hidden]*(" @(&)O
M;VP@;W!E<F%T;W(]/2AC;VYS="!!("9R:',I(&-O;G-T.PT*(" @(&)O;VP@
M;W!E<F%T;W(A/2AC;VYS="!!("9R:',I(&-O;G-T.PT*(" @(&)O;VP@;W!E
M<F%T;W(\*&-O;G-T($$@)G)H<RD_at_8V]N<W0[("\O('5S960_at_8GD@;&5S<PT*
M(" @("\O(&AA<V@@9G5N8W1I;VX_at_9F]R(&-L87-S($$-"B @("!O<&5R871O
M<B!S=&0Z.G-I>F5?=" H*2!C;VYS="![#0H@(" @(" @('-T9#HZ<VEZ95]T
M(')E='9A;" ](# [#0H@(" @(" @("\O8V]N<W0_at_8VAA<B J('1P='(@/2!S
M=&%T:6-?8V%S=#QC;VYS="!!("H_at_8V]N<W0^*'1H:7,I.PT*(" @(" @("!C
M;VYS="!V;VED("H@=B ]('1H:7,[#0H@(" @(" @(&-O;G-T(&-H87(@*B!T
M<'1R(#T@<W1A=&EC7V-A<W0\8V]N<W0_at_8VAA<B J/BAV*3L-"B @(" @(" @
M8V]N<W0_at_8VAA<B J('1E;F0@/2!T<'1R("L@<VEZ96]F*$$I.PT*(" @(" @
M("!W:&EL92AT<'1R(#P@=&5N9"D-"B @(" @(" @(" @(')E='9A;" K/2 J
M='!T<BLK.PT*(" @(" @("!R971U<FX@<F5T=F%L.PT*(" @('T-"B @("!F
M<FEE;F0@<W1D.CIO<W1R96%M("8@;W!E<F%T;W(\/"AS=&0Z.F]S=')E86T@
M)B!O<RP_at_02!C;VYS=" F(&$I.PT*(" @(&9R:65N9"!S=&0Z.FES=')E86T@
M)B!O<&5R871O<CX^*'-T9#HZ:7-T<F5A;2 F(&ES+"!!("8_at_82D[#0I].PT*
M#0IT96UP;&%T93QC;&%S<R!3/@T*=F]I9"!R86YD;VUI>F4H4R F>"D-"GL-
M"B @("!A<W-E<G0H," ]/2!X+G-I>F4H*2D[#0H@(" @9F]R*#L[*7L-"B @
M(" @(" @=6YS:6=N960@:6YT(&D@/2!S=&0Z.G)A;F0H*2 E(#(W.PT*(" @
M(" @("!I9B_at_P(#T](&DI#0H@(" @(" @(" @("!B<F5A:SL-"B @(" @(" @
M>" K/2!S=&%T:6-?8V%S=#QT>7!E;F%M92!3.CIV86QU95]T>7!E/B_at_G82<@
M+2 Q("L@:2D[#0H@(" @?0T*?0T*#0II;FQI;F4_at_03HZ02@I(#H-"B @("!B
M*'1R=64I+ T*(" @("-I9FYD968_at_0D]/4U1?3D]?24Y4-C1?5 T*(" @(&8H
M<W1D.CIR86YD*"D@*B!S=&0Z.G)A;F0H*2DL#0H@(" @9RAS=&0Z.G)A;F0H
M*2 J('-T9#HZ<F%N9"@I*2P-"B @(" C96YD:68-"B @("!L*'-T871I8U]C
M87-T/&5N=6T@:#XH<W1D.CIR86YD*"D@)2 S*2DL#0H@(" @;2AS=&0Z.G)A
M;F0H*2DL#0H@(" @;BAS=&0Z.G)A;F0H*2DL#0H@(" @;RAS=&0Z.G)A;F0H
M*2DL#0H@(" @<"AS=&0Z.G)A;F0H*2DL#0H@(" @<2AS=&0Z.G)A;F0H*2DL
M#0H@(" @(VEF;F1E9B!"3T]35%].3U]#5T-(05(-"B @("!R*'-T9#HZ<F%N
M9"@I*2P-"B @(" C96YD:68-"B @("!C*'-T9#HZ<F%N9"@I*2P-"B @("!S
M*'-T9#HZ<F%N9"@I*2P-"B @("!T*'-T9#HZ<F%N9"@I*2P-"B @("!U*'-T
M9#HZ<F%N9"@I*2P-"B @("!V*'-T9#HZ<F%N9"@I*2P-"B @("!W*"AF;&]A
M="ES=&0Z.G)A;F0H*2 O('-T9#HZ<F%N9"@I*2P-"B @("!X*"AD;W5B;&4I
M<W1D.CIR86YD*"D@+R!S=&0Z.G)A;F0H*2D-"GL-"B @("!R86YD;VUI>F4H
M>2D[#0H@(" @(VEF;F1E9B!"3T]35%].3U]35$1?5U-44DE.1PT*(" @(')A
M;F1O;6EZ92AZ*3L-"B @(" C96YD:68-"GT-"@T*:6YL:6YE(&)O;VP_at_03HZ
M;W!E<F%T;W(]/2AC;VYS="!!("9R:',I(&-O;G-T#0I[#0H@(" @0D]/4U1?
M0TA%0TLH8B ]/2!B*3L-"B @("!"3T]35%]#2$5#2RAL(#T](&PI.PT*(" @
M("-I9FYD968_at_0D]/4U1?3D]?24Y4-C1?5 T*(" @($)/3U-47T-(14-+*&8@
M/3T_at_9BD[#0H@(" @0D]/4U1?0TA%0TLH9R ]/2!G*3L-"B @(" C96YD:68-
M"B @("!"3T]35%]#2$5#2RAM(#T](&TI.PT*(" @($)/3U-47T-(14-+*&X@
M/3T@;BD[#0H@(" @0D]/4U1?0TA%0TLH;R ]/2!O*3L-"B @("!"3T]35%]#
M2$5#2RAP(#T](' I.PT*(" @($)/3U-47T-(14-+*'$@/3T@<2D[#0H@(" @
M(VEF;F1E9B!"3T]35%].3U]#5T-(05(-"B @("!"3T]35%]#2$5#2RAR(#T]
M('(I.PT*(" @("-E;F1I9_at_T*(" @($)/3U-47T-(14-+*&,@/3T_at_8RD[#0H@
M(" @0D]/4U1?0TA%0TLH<R ]/2!S*3L-"B @("!"3T]35%]#2$5#2RAT(#T]
M('0I.PT*(" @($)/3U-47T-(14-+*'4@/3T@=2D[#0H@(" @0D]/4U1?0TA%
M0TLH=B ]/2!V*3L-"B @("!"3T]35%]#2$5#2RAS=&0Z.F9A8G,H=R M('<I
M(#P@<W1D.CIN=6UE<FEC7VQI;6ET<SQF;&]A=#XZ.G)O=6YD7V5R<F]R*"DI
M.PT*(" @($)/3U-47T-(14-+*'-T9#HZ9F%B<RAX("T@>"D@/"!S=&0Z.FYU
M;65R:6-?;&EM:71S/&9L;V%T/CHZ<F]U;F1?97)R;W(H*2D[#0H@(" @0D]/
M4U1?0TA%0TLH," ]/2!Y+F-O;7!A<F4H>2DI.PT*(" @("-I9FYD968_at_0D]/
M4U1?3D]?4U1$7U=35%))3D<-"B @("!"3T]35%]#2$5#2R_at_P(#T]('HN8V]M
M<&%R92AZ*2D[#0H@(" @(V5N9&EF#0H-"B @("!I9BAB("$](')H<RYB*0T*
M(" @(" @("!R971U<FX_at_9F%L<V4[#0H@(" @:68H;" A/2!R:',N;"D-"B @
M(" @(" @<F5T=7)N(&9A;'-E.PT*(" @("-I9FYD968_at_0D]/4U1?3D]?24Y4
M-C1?5 T*(" @(&EF*&8@(3T@<FAS+F8I#0H@(" @(" @(')E='5R;B!F86QS
M93L-"B @("!I9BAG("$](')H<RYG*0T*(" @(" @("!R971U<FX_at_9F%L<V4[
M#0H@(" @(V5N9&EF#0H@(" @:68H;2 A/2!R:',N;2D-"B @(" @(" @<F5T
M=7)N(&9A;'-E.PT*(" @(&EF*&X@(3T@<FAS+FXI#0H@(" @(" @(')E='5R
M;B!F86QS93L-"B @("!I9BAO("$](')H<RYO*0T*(" @(" @("!R971U<FX@
M9F%L<V4[#0H@(" @:68H<" A/2!R:',N<"D-"B @(" @(" @<F5T=7)N(&9A
M;'-E.R -"B @("!I9BAQ("$](')H<RYQ*0T*(" @(" @("!R971U<FX_at_9F%L
M<V4[#0H@(" @(VEF;F1E9B!"3T]35%].3U]#5T-(05(-"B @("!I9BAR("$]
M(')H<RYR*0T*(" @(" @("!R971U<FX_at_9F%L<V4[( T*(" @("-E;F1I9_at_T*
M(" @(&EF*&,@(3T@<FAS+F,I#0H@(" @(" @(')E='5R;B!F86QS93L-"B @
M("!I9BAS("$](')H<RYS*0T*(" @(" @("!R971U<FX_at_9F%L<V4[#0H@(" @
M:68H=" A/2!R:',N="D-"B @(" @(" @<F5T=7)N(&9A;'-E.PT*(" @(&EF
M*'4@(3T@<FAS+G4I#0H@(" @(" @(')E='5R;B!F86QS93L@#0H@(" @:68H
M=B A/2!R:',N=BD-"B @(" @(" @<F5T=7)N(&9A;'-E.R -"B @("!I9BAS
M=&0Z.F9A8G,H=R M(')H<RYW*2 ^('-T9#HZ;G5M97)I8U]L:6UI=',\9FQO
M870^.CIR;W5N9%]E<G)O<B_at_I*0T*(" @(" @("!R971U<FX_at_9F%L<V4[#0H@
M(" @:68H<W1D.CIF86)S*'@@+2!R:',N>"D@/B!S=&0Z.FYU;65R:6-?;&EM
M:71S/&9L;V%T/CHZ<F]U;F1?97)R;W(H*2D-"B @(" @(" @<F5T=7)N(&9A
M;'-E.PT*(" @(&EF*# @(3T@>2YC;VUP87)E*')H<RYY*2D-"B @(" @(" @
M<F5T=7)N(&9A;'-E.PT*(" @("-I9FYD968_at_0D]/4U1?3D]?4U1$7U=35%))
M3D<-"B @("!I9B_at_P("$]('HN8V]M<&%R92AR:',N>BDI#0H@(" @(" @(')E
M='5R;B!F86QS93L-"B @(" C96YD:68@(" @(" -"B @("!R971U<FX@=')U
M93L-"GT-"@T*:6YL:6YE(&)O;VP_at_03HZ;W!E<F%T;W(A/2AC;VYS="!!("9R
M:',I(&-O;G-T#0I[#0H@(" @<F5T=7)N("$@*"IT:&ES(#T](')H<RD[#0I]
M#0H-"FEN;&EN92!B;V]L($$Z.F]P97)A=&]R/"AC;VYS="!!("9R:',I(&-O
M;G-T#0I[#0H@(" @:68H8B A/2!R:',N8BD-"B @(" @(" @<F5T=7)N(&(@
M/"!R:',N8CL-"B @(" C:69N9&5F($)/3U-47TY/7TE.5#8T7U0-"B @("!I
M9BAF("$](')H<RYF*0T*(" @(" @("!R971U<FX_at_9B \(')H<RYF.PT*(" @
M(&EF*&<@(3T@<FAS+F<I#0H@(" @(" @(')E='5R;B!G(#P@<FAS+F<[#0H@
M(" @(V5N9&EF#0H@(" @:68H;" A/2!R:',N;" I#0H@(" @(" @(')E='5R
M;B!L(#P@<FAS+FP[#0H@(" @:68H;2 A/2!R:',N;2 I#0H@(" @(" @(')E
M='5R;B!M(#P@<FAS+FT[#0H@(" @:68H;B A/2!R:',N;B I#0H@(" @(" @
M(')E='5R;B!N(#P@<FAS+FX[#0H@(" @:68H;R A/2!R:',N;R I#0H@(" @
M(" @(')E='5R;B!O(#P@<FAS+F\[#0H@(" @:68H<" A/2!R:',N<" I#0H@
M(" @(" @(')E='5R;B!P(#P@<FAS+G [#0H@(" @:68H<2 A/2!R:',N<2 I
M#0H@(" @(" @(')E='5R;B!Q(#P@<FAS+G$[#0H@(" @(VEF;F1E9B!"3T]3
M5%].3U]#5T-(05(-"B @("!I9BAR("$](')H<RYR("D-"B @(" @(" @<F5T
M=7)N('(@/"!R:',N<CL-"B @(" C96YD:68-"B @("!I9BAC("$](')H<RYC
M("D-"B @(" @(" @<F5T=7)N(&,@/"!R:',N8SL-"B @("!I9BAS("$](')H
M<RYS("D-"B @(" @(" @<F5T=7)N(',@/"!R:',N<SL-"B @("!I9BAT("$]
M(')H<RYT("D-"B @(" @(" @<F5T=7)N('0@/"!R:',N=#L-"B @("!I9BAU
M("$](')H<RYU("D-"B @(" @(" @<F5T=7)N('4@/"!R:',N=3L@#0H@(" @
M:68H=B A/2!R:',N=B I#0H@(" @(" @(')E='5R;B!V(#P@<FAS+G8[#0H@
M(" @:68H=R A/2!R:',N=R I#0H@(" @(" @(')E='5R;B!W(#P@<FAS+G<[
M( T*(" @(&EF*'@@(3T@<FAS+G@@*0T*(" @(" @("!R971U<FX@>" \(')H
M<RYX.PT*(" @(&EN="!I(#T@>2YC;VUP87)E*')H<RYY*3L-"B @("!I9BAI
M("$](" P("D-"B @(" @(" @<F5T=7)N(&D@/" P.PT*(" @("-I9FYD968@
M0D]/4U1?3D]?4U1$7U=35%))3D<-"B @("!I;G0@:B ]('HN8V]M<&%R92AR
M:',N>BD[#0H@(" @:68H:B A/2 @," I#0H@(" @(" @(')E='5R;B!J(#P@
M,#L-"B @(" C96YD:68-"B @("!R971U<FX_at_9F%L<V4[#0I]#0H-"B-E;F1I
E9B O+R!"3T]35%]315))04Q)6D%424].7U1%4U1?05](4% -"@``
`
end
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk