Re: [BLACKBOX] BlackBox 1.6 final version - COMPLEX datatypes?

From: [at]} <Robert>
Date: Sun, 5 Jul 2009 09:01:19 +0100

----boundary-LibPST-iamunique-1358424144_-_-
Content-type: text/plain

Hi

There has been little discussion of 'What (computer) Complex numbers are?'
and 'What (computer) Complex numbers do/should do?' in this thread.


WHAT ARE Complex NUMBERS?

The Oakwood guidelines http://www.oberon2005.ru/paper/bk1995-01e.pdf suggest
'Polar format' or 'Cartesian Format' as options.
I think most people would favour Cartesian format.

I guess the first suggestions for the type Complex would be:

TYPE
   Complex* : RECORD re*, im* : REAL END;
   Complex* : POINTER TO RECORD re*, im* : REAL END;
   Complex* : POINTER TO RECORD re-, im- : REAL END;


The first is the simplest, but does not support Complex valued
functions in CP (as it is currently defined).

The next option I think is 'dangerous' as the simple code

a := b;

can be lead to unintended and unnoticed side effects. So my libraries use the
'immutable' third option.

The third option generates a lot of garbage, and may be too inefficient for
some applications.

My current libraries (they have moved on since I published them on CPC) are not
so short (I will explain some of the reasons below):

CONST
   isReal* = 1;
   isImag* = 2;
   isComp* = 3;

TYPE
   Complex* = POINTER TO ABSTRACT RECORD
                  re-, im- : REAL;
                  is- : INTEGER
                END;

   StdComplex = POINTER TO RECORD (Complex) END;
   AuxComplex = POINTER TO RECORD (Complex) END;


Conclusion? Maybe there is not a universal agreement on what is a right
or good design, and so it would be better for the compiler NOT to implement
Complex, but to implement facilities (Overloading, Structured returns) that
facilitate external Complex libraries that can we written as required.


WHAT SHOULD Complex ARITHMETIC DO?

This is actually the most interesting point (to me). Look at what
Kahan has to say:

(Kahan was the principal architect of the IEEE 754 standard, and knows a thing
or two about floating point arithmnetic.)

http://www.eecs.berkeley.edu/~wkahan/JAVAhurt.pdf

Look at the pictures at the top of page 13, then (maybe) read from page 11.

My published Complex library produces the wrong picture on the right. My current
Complex library produces (with the same application code) the correct picture on
the left.

The reason, Kahan says, is that one needs separate classes for Real, (general)
Complex, and Imaginary. The FORTRAN (and OberonX, and many others) style of
representing Complex as a (real, imaginary) pair of REALs is incorrect. I
simulate this with the 'is' field above that can take the values isReal, isImag,
or isComplex.

The reason that REAL pairs are inadequate is that computer complex numbers are
different to mathematical ones. Computer arithmetic (as I have said on these
pages before !) distinguishes between +0 & -0, and this can be useful (in this
case it enables you to plot the correct graph).

As a flavour of the kind of code necessary I show my Square Root and
Reciprocal functions below.


Is this kind of library 'Simple'?

The library itself is NOT simple.
The 'correct' application code that uses it is.

So is this approach in the 'As simple as possible' tradition?


Regards

Robert


PS1 - Please read this as a contribution to the discussion, not as a
conclusion to 'do this' or 'do that'.


PS2 - If anyone wants to see my current Complex library in detail I
will post it and its Docu file.


PS3 - While this library is +/- zero friendly, it is not NaN friendly. BlackBox
support for NaNs is so bad that writing application code that exploits them is
next to impossible - sadly.)



PROCEDURE IsNeg* (x : REAL) : BOOLEAN; (* Detects -0. also *)
   BEGIN
     RETURN (x < 0.) OR (SYSTEM.VAL (LONGINT, x) = MIN (LONGINT))
   END IsNeg;


PROCEDURE Sqrt* (a : Complex) : Complex;
   VAR
     re, im, q, w : REAL;
     sqrt : StdComplex;
   BEGIN
ASSERT (a.is # 0, 54);
     NEW (sqrt);
     IF a.is = isReal THEN
       IF a.re >= 0. THEN sqrt.is := isReal; sqrt.re := M.Sqrt ( a.re)
                       ELSE sqrt.is := isImag; sqrt.im := M.Sqrt (-a.re) END
     ELSE
       sqrt.is := isComp;
       im := ABS (a.im);
       IF a.is = isImag THEN
         sqrt.re := M.Sqrt (im / 2.);
         IF R.IsNeg (a.im) THEN sqrt.im := -sqrt.re ELSE sqrt.im :=
sqrt.re END
       ELSE
         re := ABS (a.re);
         IF re > im THEN
           q := im / re; w := M.Sqrt (re) * M.Sqrt ((1. + M.Sqrt (1. + q *
q)) / 2.)
         ELSE
           IF im = 0. THEN sqrt.re := 0.; sqrt.im := a.im; RETURN sqrt
  END;
           q := re / im; w := M.Sqrt (im) * M.Sqrt ((q + M.Sqrt (1. + q *
q)) / 2.)
         END;
         IF a.re >= 0. THEN
           sqrt.re := w; sqrt.im := a.im / (2. * w)
         ELSE
           sqrt.re := im / (2. * w);
           IF IsNeg (a.im) THEN sqrt.im := -w ELSE sqrt.im := w END
         END
       END
     END;
     RETURN sqrt
   END Sqrt;


PROCEDURE Recip* (a : Complex) : Complex;
   VAR
     fac : REAL;
     res : StdComplex;
   BEGIN
ASSERT (a.is # 0, 54);
     NEW (res);
     CASE a.is OF
       isReal : res.re := 1. / a.re; res.is := isReal
     | isImag : res.im := -1. / a.im; res.is := isImag
     | isComp :
         res.is := isComp;
         IF ABS (a.re) >= ABS (a.im) THEN
           ASSERT (a.re # 0., 20);
           fac := a.im / a.re;
           res.re := 1. / (a.re + a.im * fac); res.im := -res.re * fac
         ELSE
           fac := a.re / a.im;
           res.im := -1. / (a.re * fac + a.im); res.re := -res.im * fac
         END
     END;
     RETURN res
   END Recip;




Georgy Jikia wrote:
> Let me try to ask a slightly different question. Suppose I do need
> COMPLEX data types in BlackBox and I am ready to get my hands dirty and
> implement COMPLEX as a new basic type. So a new COMPLEX basic type
> should be defined, mathematical operations should be implemented and the
> new type should be available in modules importing COMPLEX. Without
> procedures returning structured types and without operator
> overloading the implementation could only be done by extending system
> modules of the BlackBox. Although implementation using standard BlackBox
> modules is not possible, it seems COMPLEX could be implemented similar
> to SYSTEM or COM (pseudo-) modules, which do not exist as usual BlackBox
> SYSTEM.odc or COM.odc, but are hard coded in Dev subsystem. The problem
> is that the documentation for BlackBox modules intended for internal use
> only is absent. So, can somebody who knows inner workings of BlackBox
> make a comment on how such an extension of the core of BlackBox could be
> done? Can such an extension be localized or would it have to be spread
> all over the system modules? I guess the task is much more difficult,
> than writing overloaded operations in active oberon or C++, but it is
> interesting to know how much more difficult?
>
> Georgy
>
>
>
> ---- To unsubscribe, send a message with body "SIGNOFF BLACKBOX" to
> LISTSERV{([at]})nowhere.xy
>
>
> ------------------------------------------------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - www.avg.com
> Version: 8.5.375 / Virus Database: 270.13.3/2217 - Release Date: 07/03/09 18:11:00
>


----
To unsubscribe, send a message with body "SIGNOFF BLACKBOX" to LISTSERV{([at]})nowhere.xy----boundary-LibPST-iamunique-1358424144_-_-
Content-type: application/rtf
Content-transfer-encoding: base64
Content-Disposition: attachment; filename="rtf-body.rtf"
e1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcZnJvbXRleHQgXGRlZmYwe1xmb250dGJsDQp7XGYwXGZz
d2lzcyBBcmlhbDt9DQp7XGYxXGZtb2Rlcm4gQ291cmllciBOZXc7fQ0Ke1xmMlxmbmlsXGZjaGFy
c2V0MiBTeW1ib2w7fQ0Ke1xmM1xmbW9kZXJuXGZjaGFyc2V0MCBDb3VyaWVyIE5ldzt9fQ0Ke1xj
b2xvcnRibFxyZWQwXGdyZWVuMFxibHVlMDtccmVkMFxncmVlbjBcYmx1ZTI1NTt9DQpcdWMxXHBh
cmRccGxhaW5cZGVmdGFiMzYwIFxmMFxmczIwIEhpXHBhcg0KXHBhcg0KVGhlcmUgaGFzIGJlZW4g
bGl0dGxlIGRpc2N1c3Npb24gb2YgJ1doYXQgKGNvbXB1dGVyKSBDb21wbGV4IG51bWJlcnMgYXJl
PydccGFyDQphbmQgJ1doYXQgKGNvbXB1dGVyKSBDb21wbGV4IG51bWJlcnMgZG8vc2hvdWxkIGRv
PycgaW4gdGhpcyB0aHJlYWQuXHBhcg0KXHBhcg0KXHBhcg0KV0hBVCBBUkUgQ29tcGxleCBOVU1C
RVJTP1xwYXINClxwYXINClRoZSBPYWt3b29kIGd1aWRlbGluZXMgaHR0cDovL3d3dy5vYmVyb24y
MDA1LnJ1L3BhcGVyL2JrMTk5NS0wMWUucGRmIHN1Z2dlc3QgXHBhcg0KJ1BvbGFyIGZvcm1hdCcg
b3IgJ0NhcnRlc2lhbiBGb3JtYXQnIGFzIG9wdGlvbnMuXHBhcg0KSSB0aGluayBtb3N0IHBlb3Bs
ZSB3b3VsZCBmYXZvdXIgQ2FydGVzaWFuIGZvcm1hdC5ccGFyDQpccGFyDQpJIGd1ZXNzIHRoZSBm
aXJzdCBzdWdnZXN0aW9ucyBmb3IgdGhlIHR5cGUgQ29tcGxleCB3b3VsZCBiZTpccGFyDQpccGFy
DQpUWVBFXHBhcg0KICAgQ29tcGxleCogIDogIFJFQ09SRCByZSosIGltKiA6IFJFQUwgIEVORDtc
cGFyDQogICBDb21wbGV4KiAgOiAgUE9JTlRFUiAgVE8gIFJFQ09SRCByZSosIGltKiA6IFJFQUwg
IEVORDtccGFyDQogICBDb21wbGV4KiAgOiAgUE9JTlRFUiAgVE8gIFJFQ09SRCByZS0sIGltLSA6
IFJFQUwgIEVORDtccGFyDQpccGFyDQpccGFyDQpUaGUgZmlyc3QgaXMgdGhlIHNpbXBsZXN0LCBi
dXQgZG9lcyBub3Qgc3VwcG9ydCBDb21wbGV4IHZhbHVlZFxwYXINCmZ1bmN0aW9ucyBpbiBDUCAo
YXMgaXQgaXMgY3VycmVudGx5IGRlZmluZWQpLlxwYXINClxwYXINClRoZSBuZXh0IG9wdGlvbiBJ
IHRoaW5rIGlzICdkYW5nZXJvdXMnIGFzIHRoZSBzaW1wbGUgY29kZVxwYXINClxwYXINCmEgIDo9
ICBiO1xwYXINClxwYXINCmNhbiBiZSBsZWFkIHRvIHVuaW50ZW5kZWQgYW5kIHVubm90aWNlZCBz
aWRlIGVmZmVjdHMuIFNvIG15IGxpYnJhcmllcyB1c2UgdGhlIFxwYXINCidpbW11dGFibGUnIHRo
aXJkIG9wdGlvbi5ccGFyDQpccGFyDQpUaGUgdGhpcmQgb3B0aW9uIGdlbmVyYXRlcyBhIGxvdCBv
ZiBnYXJiYWdlLCBhbmQgbWF5IGJlIHRvbyBpbmVmZmljaWVudCBmb3JccGFyDQpzb21lIGFwcGxp
Y2F0aW9ucy5ccGFyDQpccGFyDQpNeSBjdXJyZW50IGxpYnJhcmllcyAodGhleSBoYXZlIG1vdmVk
IG9uIHNpbmNlIEkgcHVibGlzaGVkIHRoZW0gb24gQ1BDKSBhcmUgbm90IFxwYXINCnNvIHNob3J0
IChJIHdpbGwgZXhwbGFpbiBzb21lIG9mIHRoZSByZWFzb25zIGJlbG93KTpccGFyDQpccGFyDQpD
T05TVFxwYXINCiAgIGlzUmVhbCogID0gIDE7XHBhcg0KICAgaXNJbWFnKiAgPSAgMjtccGFyDQog
ICBpc0NvbXAqICA9ICAzO1xwYXINClxwYXINClRZUEVccGFyDQogICBDb21wbGV4KiAgPSAgUE9J
TlRFUiAgVE8gIEFCU1RSQUNUICBSRUNPUkRccGFyDQogICAgICAgICAgICAgICAgICByZS0sIGlt
LSAgOiAgUkVBTDtccGFyDQogICAgICAgICAgICAgICAgICBpcy0gICAgICAgOiAgSU5URUdFUlxw
YXINCiAgICAgICAgICAgICAgICBFTkQ7XHBhcg0KXHBhcg0KICAgU3RkQ29tcGxleCAgPSAgUE9J
TlRFUiAgVE8gIFJFQ09SRCAoQ29tcGxleCkgRU5EO1xwYXINCiAgIEF1eENvbXBsZXggID0gIFBP
SU5URVIgIFRPICBSRUNPUkQgKENvbXBsZXgpIEVORDtccGFyDQpccGFyDQpccGFyDQpDb25jbHVz
aW9uPyBNYXliZSB0aGVyZSBpcyBub3QgYSB1bml2ZXJzYWwgYWdyZWVtZW50IG9uIHdoYXQgaXMg
YSByaWdodFxwYXINCm9yIGdvb2QgZGVzaWduLCBhbmQgc28gaXQgd291bGQgYmUgYmV0dGVyIGZv
ciB0aGUgY29tcGlsZXIgTk9UIHRvIGltcGxlbWVudFxwYXINCkNvbXBsZXgsIGJ1dCB0byBpbXBs
ZW1lbnQgZmFjaWxpdGllcyAoT3ZlcmxvYWRpbmcsIFN0cnVjdHVyZWQgcmV0dXJucykgdGhhdFxw
YXINCmZhY2lsaXRhdGUgZXh0ZXJuYWwgQ29tcGxleCBsaWJyYXJpZXMgdGhhdCBjYW4gd2Ugd3Jp
dHRlbiBhcyByZXF1aXJlZC5ccGFyDQpccGFyDQpccGFyDQpXSEFUIFNIT1VMRCBDb21wbGV4IEFS
SVRITUVUSUMgRE8/XHBhcg0KXHBhcg0KVGhpcyBpcyBhY3R1YWxseSB0aGUgbW9zdCBpbnRlcmVz
dGluZyBwb2ludCAodG8gbWUpLiBMb29rIGF0IHdoYXRccGFyDQpLYWhhbiBoYXMgdG8gc2F5Olxw
YXINClxwYXINCihLYWhhbiB3YXMgdGhlIHByaW5jaXBhbCBhcmNoaXRlY3Qgb2YgdGhlIElFRUUg
NzU0IHN0YW5kYXJkLCBhbmQga25vd3MgYSB0aGluZyBccGFyDQpvciB0d28gYWJvdXQgZmxvYXRp
bmcgcG9pbnQgYXJpdGhtbmV0aWMuKVxwYXINClxwYXINCmh0dHA6Ly93d3cuZWVjcy5iZXJrZWxl
eS5lZHUvfndrYWhhbi9KQVZBaHVydC5wZGZccGFyDQpccGFyDQpMb29rIGF0IHRoZSBwaWN0dXJl
cyBhdCB0aGUgdG9wIG9mIHBhZ2UgMTMsIHRoZW4gKG1heWJlKSByZWFkIGZyb20gcGFnZSAxMS5c
cGFyDQpccGFyDQpNeSBwdWJsaXNoZWQgQ29tcGxleCBsaWJyYXJ5IHByb2R1Y2VzIHRoZSB3cm9u
ZyBwaWN0dXJlIG9uIHRoZSByaWdodC4gTXkgY3VycmVudFxwYXINCkNvbXBsZXggbGlicmFyeSBw
cm9kdWNlcyAod2l0aCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBjb2RlKSB0aGUgY29ycmVjdCBwaWN0
dXJlIG9uIFxwYXINCnRoZSBsZWZ0LlxwYXINClxwYXINClRoZSByZWFzb24sIEthaGFuIHNheXMs
IGlzIHRoYXQgb25lIG5lZWRzIHNlcGFyYXRlIGNsYXNzZXMgZm9yIFJlYWwsIChnZW5lcmFsKSBc
cGFyDQpDb21wbGV4LCBhbmQgSW1hZ2luYXJ5LiBUaGUgRk9SVFJBTiAoYW5kIE9iZXJvblgsIGFu
ZCBtYW55IG90aGVycykgc3R5bGUgb2YgXHBhcg0KcmVwcmVzZW50aW5nIENvbXBsZXggYXMgYSAo
cmVhbCwgaW1hZ2luYXJ5KSBwYWlyIG9mIFJFQUxzIGlzIGluY29ycmVjdC4gSSBccGFyDQpzaW11
bGF0ZSB0aGlzIHdpdGggdGhlICdpcycgZmllbGQgYWJvdmUgdGhhdCBjYW4gdGFrZSB0aGUgdmFs
dWVzIGlzUmVhbCwgaXNJbWFnLCBccGFyDQpvciBpc0NvbXBsZXguXHBhcg0KXHBhcg0KVGhlIHJl
YXNvbiB0aGF0IFJFQUwgcGFpcnMgYXJlIGluYWRlcXVhdGUgaXMgdGhhdCBjb21wdXRlciBjb21w
bGV4IG51bWJlcnMgYXJlXHBhcg0KZGlmZmVyZW50IHRvIG1hdGhlbWF0aWNhbCBvbmVzLiBDb21w
dXRlciBhcml0aG1ldGljIChhcyBJIGhhdmUgc2FpZCBvbiB0aGVzZSBccGFyDQpwYWdlcyBiZWZv
cmUgISkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuICswICYgLTAsIGFuZCB0aGlzIGNhbiBiZSB1c2Vm
dWwgKGluIHRoaXMgXHBhcg0KY2FzZSBpdCBlbmFibGVzIHlvdSB0byBwbG90IHRoZSBjb3JyZWN0
IGdyYXBoKS5ccGFyDQpccGFyDQpBcyBhIGZsYXZvdXIgb2YgdGhlIGtpbmQgb2YgY29kZSBuZWNl
c3NhcnkgSSBzaG93IG15IFNxdWFyZSBSb290IGFuZFxwYXINClJlY2lwcm9jYWwgZnVuY3Rpb25z
IGJlbG93LlxwYXINClxwYXINClxwYXINCklzIHRoaXMga2luZCBvZiBsaWJyYXJ5ICdTaW1wbGUn
P1xwYXINClxwYXINClRoZSBsaWJyYXJ5IGl0c2VsZiBpcyBOT1Qgc2ltcGxlLlxwYXINClRoZSAn
Y29ycmVjdCcgYXBwbGljYXRpb24gY29kZSB0aGF0IHVzZXMgaXQgaXMuXHBhcg0KXHBhcg0KU28g
aXMgdGhpcyBhcHByb2FjaCBpbiB0aGUgJ0FzIHNpbXBsZSBhcyBwb3NzaWJsZScgdHJhZGl0aW9u
P1xwYXINClxwYXINClxwYXINClJlZ2FyZHNccGFyDQpccGFyDQpSb2JlcnRccGFyDQpccGFyDQpc
cGFyDQpQUzEgLSBQbGVhc2UgcmVhZCB0aGlzIGFzIGEgY29udHJpYnV0aW9uIHRvIHRoZSBkaXNj
dXNzaW9uLCBub3QgYXMgYVxwYXINCmNvbmNsdXNpb24gdG8gJ2RvIHRoaXMnIG9yICdkbyB0aGF0
Jy5ccGFyDQpccGFyDQpccGFyDQpQUzIgLSBJZiBhbnlvbmUgd2FudHMgdG8gc2VlIG15IGN1cnJl
bnQgQ29tcGxleCBsaWJyYXJ5IGluIGRldGFpbCBJXHBhcg0Kd2lsbCBwb3N0IGl0IGFuZCBpdHMg
RG9jdSBmaWxlLlxwYXINClxwYXINClxwYXINClBTMyAtIFdoaWxlIHRoaXMgbGlicmFyeSBpcyAr
Ly0gemVybyBmcmllbmRseSwgaXQgaXMgbm90IE5hTiBmcmllbmRseS4gQmxhY2tCb3hccGFyDQpz
dXBwb3J0IGZvciBOYU5zIGlzIHNvIGJhZCB0aGF0IHdyaXRpbmcgYXBwbGljYXRpb24gY29kZSB0
aGF0IGV4cGxvaXRzIHRoZW0gaXNccGFyDQpuZXh0IHRvIGltcG9zc2libGUgLSBzYWRseS4pXHBh
cg0KXHBhcg0KXHBhcg0KXHBhcg0KUFJPQ0VEVVJFICBJc05lZyogKHggOiBSRUFMKSA6IEJPT0xF
QU47XHRhYiAoKiAgRGV0ZWN0cyAtMC4gYWxzbyAgKilccGFyDQogICBCRUdJTlxwYXINCiAgICAg
UkVUVVJOICAoeCAgPCAgMC4pICBPUiAgKFNZU1RFTS5WQUwgKExPTkdJTlQsIHgpID0gTUlOIChM
T05HSU5UKSlccGFyDQogICBFTkQgIElzTmVnO1xwYXINClxwYXINClxwYXINClBST0NFRFVSRSAg
U3FydCogKGEgOiBDb21wbGV4KSA6IENvbXBsZXg7XHBhcg0KICAgVkFSXHBhcg0KICAgICByZSwg
aW0sIHEsIHcgIDogIFJFQUw7XHBhcg0KICAgICBzcXJ0ICAgICAgICAgIDogIFN0ZENvbXBsZXg7
XHBhcg0KICAgQkVHSU5ccGFyDQpBU1NFUlQgKGEuaXMgIyAwLCA1NCk7XHBhcg0KICAgICBORVcg
KHNxcnQpO1xwYXINCiAgICAgSUYgIGEuaXMgPSBpc1JlYWwgIFRIRU5ccGFyDQogICAgICAgSUYg
IGEucmUgPj0gMC4gIFRIRU4gIHNxcnQuaXMgIDo9ICBpc1JlYWw7IHNxcnQucmUgIDo9ICBNLlNx
cnQgKCBhLnJlKVxwYXINCiAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgc3FydC5pcyAgOj0g
IGlzSW1hZzsgc3FydC5pbSAgOj0gIE0uU3FydCAoLWEucmUpICBFTkRccGFyDQogICAgIEVMU0Vc
cGFyDQogICAgICAgc3FydC5pcyAgOj0gIGlzQ29tcDtccGFyDQogICAgICAgaW0gIDo9ICBBQlMg
KGEuaW0pO1xwYXINCiAgICAgICBJRiAgYS5pcyA9IGlzSW1hZyAgVEhFTlxwYXINCiAgICAgICAg
IHNxcnQucmUgIDo9ICBNLlNxcnQgKGltIC8gMi4pO1xwYXINCiAgICAgICAgIElGICBSLklzTmVn
IChhLmltKSAgVEhFTiAgc3FydC5pbSAgOj0gIC1zcXJ0LnJlICBFTFNFICBzcXJ0LmltICA6PSBc
cGFyDQpzcXJ0LnJlICBFTkRccGFyDQogICAgICAgRUxTRVxwYXINCiAgICAgICAgIHJlICA6PSAg
QUJTIChhLnJlKTtccGFyDQogICAgICAgICBJRiAgcmUgID4gIGltICBUSEVOXHBhcg0KICAgICAg
ICAgICBxICA6PSAgaW0gLyByZTsgdyAgOj0gIE0uU3FydCAocmUpICogTS5TcXJ0ICgoMS4gKyBN
LlNxcnQgKDEuICsgcSAqIFxwYXINCnEpKSAvIDIuKVxwYXINCiAgICAgICAgIEVMU0VccGFyDQog
ICAgICAgICAgIElGICBpbSAgPSAgMC4gIFRIRU4gIHNxcnQucmUgIDo9ICAwLjsgc3FydC5pbSAg
Oj0gIGEuaW07IFJFVFVSTiAgc3FydCBccGFyDQogIEVORDtccGFyDQogICAgICAgICAgIHEgIDo9
ICByZSAvIGltOyB3ICA6PSAgTS5TcXJ0IChpbSkgKiBNLlNxcnQgKChxICArIE0uU3FydCAoMS4g
KyBxICogXHBhcg0KcSkpIC8gMi4pXHBhcg0KICAgICAgICAgRU5EO1xwYXINCiAgICAgICAgIElG
ICBhLnJlICA+PSAgMC4gIFRIRU5ccGFyDQogICAgICAgICAgIHNxcnQucmUgIDo9ICB3OyBzcXJ0
LmltICA6PSAgYS5pbSAvICgyLiAqIHcpXHBhcg0KICAgICAgICAgRUxTRVxwYXINCiAgICAgICAg
ICAgc3FydC5yZSAgOj0gIGltIC8gKDIuICogdyk7XHBhcg0KICAgICAgICAgICBJRiAgSXNOZWcg
KGEuaW0pICBUSEVOICBzcXJ0LmltICA6PSAgLXcgICBFTFNFICBzcXJ0LmltICA6PSAgdyAgRU5E
XHBhcg0KICAgICAgICAgRU5EXHBhcg0KICAgICAgIEVORFxwYXINCiAgICAgRU5EO1xwYXINCiAg
ICAgUkVUVVJOICBzcXJ0XHBhcg0KICAgRU5EICBTcXJ0O1xwYXINClxwYXINClxwYXINClBST0NF
RFVSRSAgUmVjaXAqIChhIDogQ29tcGxleCkgOiBDb21wbGV4O1xwYXINCiAgIFZBUlxwYXINCiAg
ICAgZmFjICA6ICBSRUFMO1xwYXINCiAgICAgcmVzICA6ICBTdGRDb21wbGV4O1xwYXINCiAgIEJF
R0lOXHBhcg0KQVNTRVJUIChhLmlzICMgMCwgNTQpO1xwYXINCiAgICAgTkVXIChyZXMpO1xwYXIN
CiAgICAgQ0FTRSAgYS5pcyAgT0ZccGFyDQogICAgICAgaXNSZWFsICA6ICByZXMucmUgIDo9ICAx
LiAvIGEucmU7IHJlcy5pcyAgOj0gIGlzUmVhbFxwYXINCiAgICAgfCBpc0ltYWcgIDogIHJlcy5p
bSAgOj0gLTEuIC8gYS5pbTsgcmVzLmlzICA6PSAgaXNJbWFnXHBhcg0KICAgICB8IGlzQ29tcCAg
OlxwYXINCiAgICAgICAgIHJlcy5pcyAgOj0gIGlzQ29tcDtccGFyDQogICAgICAgICBJRiAgQUJT
IChhLnJlKSAgPj0gIEFCUyAoYS5pbSkgIFRIRU5ccGFyDQogICAgICAgICAgIEFTU0VSVCAoYS5y
ZSAjIDAuLCAyMCk7XHBhcg0KICAgICAgICAgICBmYWMgICAgIDo9ICBhLmltIC8gYS5yZTtccGFy
DQogICAgICAgICAgIHJlcy5yZSAgOj0gIDEuIC8gKGEucmUgKyBhLmltICogZmFjKTsgcmVzLmlt
ICA6PSAtcmVzLnJlICogZmFjXHBhcg0KICAgICAgICAgRUxTRVxwYXINCiAgICAgICAgICAgZmFj
ICAgICA6PSAgYS5yZSAvIGEuaW07XHBhcg0KICAgICAgICAgICByZXMuaW0gIDo9IC0xLiAvIChh
LnJlICogZmFjICsgYS5pbSk7IHJlcy5yZSAgOj0gLXJlcy5pbSAqIGZhY1xwYXINCiAgICAgICAg
IEVORFxwYXINCiAgICAgRU5EO1xwYXINCiAgICAgUkVUVVJOICByZXNccGFyDQogICBFTkQgIFJl
Y2lwO1xwYXINClxwYXINClxwYXINClxwYXINClxwYXINCkdlb3JneSBKaWtpYSB3cm90ZTpccGFy
DQo+IExldCBtZSB0cnkgdG8gYXNrIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHF1ZXN0aW9uLiBTdXBw
b3NlIEkgZG8gbmVlZCBccGFyDQo+IENPTVBMRVggZGF0YSB0eXBlcyBpbiBCbGFja0JveCBhbmQg
SSBhbSByZWFkeSB0byBnZXQgbXkgaGFuZHMgZGlydHkgYW5kIFxwYXINCj4gaW1wbGVtZW50IENP
TVBMRVggYXMgYSBuZXcgYmFzaWMgdHlwZS4gU28gYSBuZXcgQ09NUExFWCBiYXNpYyB0eXBlIFxw
YXINCj4gc2hvdWxkIGJlIGRlZmluZWQsIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIHNob3VsZCBi
ZSBpbXBsZW1lbnRlZCBhbmQgdGhlIFxwYXINCj4gbmV3IHR5cGUgc2hvdWxkIGJlIGF2YWlsYWJs
ZSBpbiBtb2R1bGVzIGltcG9ydGluZyBDT01QTEVYLiBXaXRob3V0IFxwYXINCj4gcHJvY2VkdXJl
cyByZXR1cm5pbmcgc3RydWN0dXJlZCB0eXBlcyBhbmQgd2l0aG91dCBvcGVyYXRvciBccGFyDQo+
IG92ZXJsb2FkaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBjb3VsZCBvbmx5IGJlIGRvbmUgYnkgZXh0
ZW5kaW5nIHN5c3RlbSBccGFyDQo+IG1vZHVsZXMgb2YgdGhlIEJsYWNrQm94LiBBbHRob3VnaCBp
bXBsZW1lbnRhdGlvbiB1c2luZyBzdGFuZGFyZCBCbGFja0JveCBccGFyDQo+IG1vZHVsZXMgaXMg
bm90IHBvc3NpYmxlLCBpdCBzZWVtcyBDT01QTEVYIGNvdWxkIGJlIGltcGxlbWVudGVkIHNpbWls
YXIgXHBhcg0KPiB0byBTWVNURU0gb3IgQ09NIChwc2V1ZG8tKSBtb2R1bGVzLCB3aGljaCBkbyBu
b3QgZXhpc3QgYXMgdXN1YWwgQmxhY2tCb3ggXHBhcg0KPiBTWVNURU0ub2RjIG9yIENPTS5vZGMs
IGJ1dCBhcmUgaGFyZCBjb2RlZCAgaW4gRGV2IHN1YnN5c3RlbS4gVGhlIHByb2JsZW0gXHBhcg0K
PiBpcyB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGZvciBCbGFja0JveCBtb2R1bGVzIGludGVuZGVk
IGZvciBpbnRlcm5hbCB1c2UgXHBhcg0KPiBvbmx5IGlzIGFic2VudC4gU28sIGNhbiBzb21lYm9k
eSB3aG8ga25vd3MgaW5uZXIgd29ya2luZ3Mgb2YgQmxhY2tCb3ggXHBhcg0KPiBtYWtlIGEgY29t
bWVudCBvbiBob3cgc3VjaCBhbiBleHRlbnNpb24gb2YgdGhlIGNvcmUgb2YgQmxhY2tCb3ggY291
bGQgYmUgXHBhcg0KPiBkb25lPyBDYW4gc3VjaCBhbiBleHRlbnNpb24gYmUgbG9jYWxpemVkIG9y
IHdvdWxkIGl0IGhhdmUgdG8gYmUgc3ByZWFkIFxwYXINCj4gYWxsIG92ZXIgdGhlIHN5c3RlbSBt
b2R1bGVzPyBJIGd1ZXNzIHRoZSB0YXNrIGlzIG11Y2ggbW9yZSBkaWZmaWN1bHQsIFxwYXINCj4g
dGhhbiB3cml0aW5nIG92ZXJsb2FkZWQgb3BlcmF0aW9ucyBpbiBhY3RpdmUgb2Jlcm9uIG9yIEMr
KywgYnV0IGl0IGlzIFxwYXINCj4gaW50ZXJlc3RpbmcgdG8ga25vdyBob3cgbXVjaCBtb3JlIGRp
ZmZpY3VsdD9ccGFyDQo+ICBccGFyDQo+IEdlb3JneVxwYXINCj4gXHBhcg0KPiAgXHBhcg0KPiBc
cGFyDQo+IC0tLS0gVG8gdW5zdWJzY3JpYmUsIHNlbmQgYSBtZXNzYWdlIHdpdGggYm9keSAiU0lH
Tk9GRiBCTEFDS0JPWCIgdG8gXHBhcg0KPiBMSVNUU0VSVkBMSVNUUy5PQkVST04uQ0hccGFyDQo+
IFxwYXINCj4gXHBhcg0KPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ccGFyDQo+IFxwYXINCj4gXHBhcg0KPiBO
byB2aXJ1cyBmb3VuZCBpbiB0aGlzIGluY29taW5nIG1lc3NhZ2UuXHBhcg0KPiBDaGVja2VkIGJ5
IEFWRyAtIHd3dy5hdmcuY29tIFxwYXINCj4gVmVyc2lvbjogOC41LjM3NSAvIFZpcnVzIERhdGFi
YXNlOiAyNzAuMTMuMy8yMjE3IC0gUmVsZWFzZSBEYXRlOiAwNy8wMy8wOSAxODoxMTowMFxwYXIN
Cj4gXHBhcg0KXHBhcg0KXHBhcg0KLS0tLVxwYXINClRvIHVuc3Vic2NyaWJlLCBzZW5kIGEgbWVz
c2FnZSB3aXRoIGJvZHkgIlNJR05PRkYgQkxBQ0tCT1giIHRvIExJU1RTRVJWQExJU1RTLk9CfX0A
dGFnMTA0IDwvZGk=
----boundary-LibPST-iamunique-1358424144_-_---
Received on Sun Jul 05 2009 - 10:01:19 UTC

This archive was generated by hypermail 2.3.0 : Thu Sep 26 2013 - 06:30:44 UTC