RE: Unsigned integer math in BlackBox

From: CFB Software <"CFB>
Date: Mon, 17 Nov 2003 12:43:54 +1030

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

Wojtek,

I sympathise as I've grappled with similar challenges with Oberon / CP
many times. However, I'm neither in favour of introducing assembler-like
statements into a high-level language, nor introducing the same sort of
complexity that Modula-2 had with its unsigned / signed types.

Some minor enhancements, that others have implemented, could make all
the difference. However, first a couple of observations:

1. ASH is an ARITHMETIC shift, designed to be used with 2s-complement
numbers and should not be used when working with unsigned quantities. If
you need more info:

http://www.cis.ksu.edu/Systems/Info/gnu/elisp.Bitwise_Operations.html

2. 'Logical shift left' in CP is done using a multiply by the
appropriate power of two:

e.g. i * 256 is *generally* equivalent to LSH(i, 8) but is still
problematic wherever the sign bit is set.

This probably would not have simplified your code greatly as you still
have to cater for integer overflows.

3. Queensland University of Technology's version of Component Pascal has
two minor enhancements which helps to address this sort of problem. They
have one unsigned type UBYTE, and an [UNCHECKED_ARITHMETIC] directive to
avoid integer overflow traps. I had to use this recently when reading
from a foreign file containing a mixture of byte-sized and integer-sized
quantities. Using these features result in this sort of code:

TYPE
  Reader* = POINTER TO RECORD
    f: BF.FILE;
    Buffer: POINTER TO ARRAY OF UBYTE;
    Cursor, FileSize: INTEGER;
  END;

PROCEDURE (rd: Reader) ReadByte(): UBYTE, NEW;
BEGIN
  INC(rd.Cursor);
  RETURN rd.Buffer[rd.Cursor];
END ReadByte;

PROCEDURE (rd: Reader) ReadShort*(OUT w: SHORTINT), NEW;
BEGIN
  w := SHORT((rd.ReadByte() * 256) + rd.ReadByte());
END ReadShort;

PROCEDURE (rd: Reader) ReadInt(OUT int: INTEGER), NEW;
VAR
  i: INTEGER;
BEGIN [UNCHECKED_ARITHMETIC]
  int := 0;
  FOR i := 1 TO 4 DO
    int := int * 256 + rd.ReadByte();
  END;
END ReadInt;

Maybe BlackBox could consider incorporating the same or similar
enhancements.

Chris Burrows
CFB Software
http://www.cfbsoftware.com

> -----Original Message-----
> From: Wojtek Skulski [mailto:skulski{([at]})nowhere.xy
> Sent: Monday, 17 November 2003 8:14AM
> To: Bernhard Treutwein
> Cc: BlackBox
> Subject: Re: Unsigned integer math in BlackBox
>
>
> Bernard:
>
> thank you for reminding me of unions in SYSTEM. I will add
> unions to my bag of tricks, though the spirit of BB/CP
> prohibits using SYSTEM unless absolutely necessary.
>
> There is actually a third way, that is providing good
> application notes dealing with such low-level issues.
> BlackBox vendor is one of few vendors I know of who do not
> bother to write application notes and reference materials.
> The quality of the compiler is outstanding, but the quality
> of its surrounding documentation -- well, we all know. I had
> to painfully reinvent things which most likely are well known
> but undocumented.
>
> Wojtek Skulski skulski{([at]})nowhere.xy
> On Sun, 16 Nov 2003, Bernhard Treutwein wrote:
>
> > Dear Wojtek,
> >
> > on the one hand I agree absolutely that unsigned should be
> available
> > (at least in SYSTEM or some other low level module). It is
> necessary
> > for interfacing ...
> >
> > but on the other hand your problem might be easily solved
> by applying
> > low level system tag "union" and doing the old and dirty trick of
> > overlaying different structures on the same memory:
> >
> > IMPORT SYSTEM;
> >
> > TYPE
> >
> > Dirt = RECORD [ union ]
> > i : INTEGER;
> > h, l : BYTE (* maybe also the other way round, i.e.,
> l, h *) END;
> >
> > VAR
> > dirty : Dirt;
> >
> > ...
> > dirty.h := byte; dirty.l := byte;
> > memPtr := dirty.i;
> > ...
> >
> > I know this is against the spirit of BB/CP, but in the case of
> > hardware interfacing/language interfacing almost anything
> sacrifices
> > the means used.
> >
> >
> > ----- Original Message -----
> > From: "Wojtek Skulski" <skulski{([at]})nowhere.xy
> > To: "BlackBox" <blackbox{([at]})nowhere.xy
> > Cc: "Wojtek Skulski" <skulski{([at]})nowhere.xy
> > Sent: Sunday, November 16, 2003 6:04 PM
> > Subject: Unsigned integer math in BlackBox
> >
> >
> > > Hello:
> > >

> > > I just reached a conclusion, that lack of unsigned
> integer math in
> > > BlackBox is a royal pain in the bottom. If not for my
> respect to our
> > > OuS friends, I would have used more explicit language to describe
> > > their language design decision.
> > >
> > > Here is the story. For last three days I has chasing
> missing bits in
> > > the memory pointer which I read from an field-programmable gate
> > > array. As usual in such circumstances, I was suspecting bad FPGA
> > > timing, or bugs in the embedded microcontroller C-code,
> or perhaps
> > > bad solder joints on my PCB. It did not occur to me that our
> > > rock-solid BlackBox can introduce subtle bugs. Right?
> Wrong. It can
> > > and it did. Here is how.
> > >
> > > The FPGA memory pointer is read in two 8-bit chunks, an
> MSB and LSB.
> > > The LSB contains lower 8 bits, while the MSB contains the
> remaining
> > > bits. The MSB and LSB arrive in a byte buffer, and then they are
> > > combined in the PC into one word. Written in the (vastly inferior
> > > and known for its obscurity) C-language this would have
> been simple:
> > >
> > > unsigned char lsb, msb;
> > > unsigned int memPtr;
> > > msb = buffer [2];
> > > lsb = buffer [3];
> > > memPtr = (msb << 8) + lsb;
> > >
> > > In the (vastly superior and known for its clarity)
> Component Pascal
> > > I have written code, which I thought was doing the same thing.
> > >
> > > VAR buffer: ARRAY 256 of BYTE;
> > > memPtr: INTEGER;
> > > memPtr := ASH (buffer [2], 8) + buffer [3];
> > >
> > > This is nice and looks innocent enough. Then the hell
> broke loose.
> > > Sometimes the memory pointer was correct. But sometimes
> it was not.
> > > Sometimes, but not always, bits were missing in the upper part of
> > > the pointer. After three days of debugging it turned out that the
> > > correct code should have been:
> > >
> > > VAR lsb, msb: INTEGER;
> > > buffer: ARRAY 256 of BYTE;
> > > memPtr: INTEGER;
> > > msb := ORD (BITS (ASH (buffer [2], 8)) * {8..15});
> > > lsb := ORD (BITS (buffer [3]) * {0..7});
> > > memPtr := msb + lsb;
> > >
> > > I leave it to you to figure out why this obfuscated code is the
> > > correct CP version of "(msb << 8) + lsb". It is also important to
> > > note that the bug was showing only for some bit patterns, but not
> > > for the others, what made it exceptionally hard to debug the
> > > original CP code.
> > >
> > > I want to point out that the CP language is not complete. The
> > > unsigned math should have been there. The users have been arguing
> > > with OuS for years that the unsigned math is essential,
> all in vain.

> > > I hope that I have made it more clear why the unsigned
> should have
> > > been in the language.
> > >
> > > Thank you,
> > >
> > > Wojtek Skulski skulski{([at]})nowhere.xy
> > >
> > > --------------------------------------------
> > >
> > > To unsubscribe from this mailing list, send a message
> containing the
> > > word
> > "unsubscribe" to:
> > > blackbox-request{([at]})nowhere.xy
> > >
> > > To get a list of valid e-mail commands and instructions on their
> > > usage,
> > send a message containing the word "help" to the above address.
> > >
> > > Send any problem reports or questions related to this
> email list to
> > > the
> > list owner at
> > > owner-blackbox{([at]})nowhere.xy
> > >
> > > Current posting policy:
> > >
> > > a) To post you should use the same address by which you are
> > > subscribed to
> > the mailing list. That way, the list server will recognize you as
> > subscriber and forward your posting immediately, without
> creating any
> > overhead.
> > >
> > > b) If, for some reason, you cannot post from the address,
> by which
> > > you are
> > subscribed, your message will be moderated to avoid spam. Please
> > understand that moderation will often cause some delay, in
> particular
> > over weekends or holydays.
> >
> >
> >
>
> --------------------------------------------
>
> To unsubscribe from this mailing list, send a message
> containing the word "unsubscribe" to:
> blackbox-request{([at]})nowhere.xy
>
> To get a list of valid e-mail commands and instructions on
> their usage, send a message containing the word "help" to the
> above address.
>
> Send any problem reports or questions related to this email
> list to the list owner at
> owner-blackbox{([at]})nowhere.xy
>
> Current posting policy:
>
> a) To post you should use the same address by which you are
> subscribed to the mailing list. That way, the list server
> will recognize you as subscriber and forward your posting
> immediately, without creating any overhead.
>
> b) If, for some reason, you cannot post from the address, by
> which you are subscribed, your message will be moderated to
> avoid spam. Please understand that moderation will often
> cause some delay, in particular over weekends or holydays.
>

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

To unsubscribe from this mailing list, send a message containing the word "unsubscribe" to:
   blackbox-request{([at]})nowhere.xy

To get a list of valid e-mail commands and instructions on their usage, send a message containing the word "help" to the above address.

Send any problem reports or questions related to this email list to the list owner at
   owner-blackbox{([at]})nowhere.xy

Current posting policy:

a) To post you should use the same address by which you are subscribed to the mailing list. That way, the list server will recognize you as subscriber and forward your posting immediately, without creating any overhead.

b) If, for some reason, you cannot post from the address, by which you are subscribed, your message will be moderated to avoid spam. Please understand that moderation will often cause some delay, in particular over weekends or holydays.



----boundary-LibPST-iamunique-686755198_-_-
Content-type: application/rtf
Content-transfer-encoding: base64
Content-Disposition: attachment; filename="rtf-body.rtf"

e1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcZnJvbXRleHQgXGRlZmYwe1xmb250dGJsDQp7XGYwXGZz
d2lzcyBBcmlhbDt9DQp7XGYxXGZtb2Rlcm4gQ291cmllciBOZXc7fQ0Ke1xmMlxmbmlsXGZjaGFy
c2V0MiBTeW1ib2w7fQ0Ke1xmM1xmbW9kZXJuXGZjaGFyc2V0MCBDb3VyaWVyIE5ldzt9fQ0Ke1xj
b2xvcnRibFxyZWQwXGdyZWVuMFxibHVlMDtccmVkMFxncmVlbjBcYmx1ZTI1NTt9DQpcdWMxXHBh
cmRccGxhaW5cZGVmdGFiMzYwIFxmMFxmczIwIFdvanRlayxccGFyDQpccGFyDQpJIHN5bXBhdGhp
c2UgYXMgSSd2ZSBncmFwcGxlZCB3aXRoIHNpbWlsYXIgY2hhbGxlbmdlcyB3aXRoIE9iZXJvbiAv
IENQXHBhcg0KbWFueSB0aW1lcy4gSG93ZXZlciwgSSdtIG5laXRoZXIgaW4gZmF2b3VyIG9mIGlu
dHJvZHVjaW5nIGFzc2VtYmxlci1saWtlXHBhcg0Kc3RhdGVtZW50cyBpbnRvIGEgaGlnaC1sZXZl
bCBsYW5ndWFnZSwgbm9yIGludHJvZHVjaW5nIHRoZSBzYW1lIHNvcnQgb2ZccGFyDQpjb21wbGV4
aXR5IHRoYXQgTW9kdWxhLTIgaGFkIHdpdGggaXRzIHVuc2lnbmVkIC8gc2lnbmVkIHR5cGVzLiBc
cGFyDQpccGFyDQpTb21lIG1pbm9yIGVuaGFuY2VtZW50cywgdGhhdCBvdGhlcnMgaGF2ZSBpbXBs
ZW1lbnRlZCwgY291bGQgbWFrZSBhbGxccGFyDQp0aGUgZGlmZmVyZW5jZS4gSG93ZXZlciwgZmly
c3QgYSBjb3VwbGUgb2Ygb2JzZXJ2YXRpb25zOlxwYXINClxwYXINCjEuIEFTSCBpcyBhbiBBUklU
SE1FVElDIHNoaWZ0LCBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggMnMtY29tcGxlbWVudFxwYXIN
Cm51bWJlcnMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIHdvcmtpbmcgd2l0aCB1bnNpZ25l
ZCBxdWFudGl0aWVzLiBJZlxwYXINCnlvdSBuZWVkIG1vcmUgaW5mbzpccGFyDQpccGFyDQpodHRw
Oi8vd3d3LmNpcy5rc3UuZWR1L1N5c3RlbXMvSW5mby9nbnUvZWxpc3AuQml0d2lzZV9PcGVyYXRp
b25zLmh0bWxccGFyDQpccGFyDQoyLiAnTG9naWNhbCBzaGlmdCBsZWZ0JyBpbiBDUCBpcyBkb25l
IHVzaW5nIGEgbXVsdGlwbHkgYnkgdGhlXHBhcg0KYXBwcm9wcmlhdGUgcG93ZXIgb2YgdHdvOlxw
YXINClxwYXINCmUuZy4gaSAqIDI1NiBpcyAqZ2VuZXJhbGx5KiBlcXVpdmFsZW50IHRvIExTSChp
LCA4KSBidXQgaXMgc3RpbGxccGFyDQpwcm9ibGVtYXRpYyB3aGVyZXZlciB0aGUgc2lnbiBiaXQg
aXMgc2V0LlxwYXINClxwYXINClRoaXMgcHJvYmFibHkgd291bGQgbm90IGhhdmUgc2ltcGxpZmll
ZCB5b3VyIGNvZGUgZ3JlYXRseSBhcyB5b3Ugc3RpbGxccGFyDQpoYXZlIHRvIGNhdGVyIGZvciBp
bnRlZ2VyIG92ZXJmbG93cy4gXHBhcg0KXHBhcg0KMy4gUXVlZW5zbGFuZCBVbml2ZXJzaXR5IG9m
IFRlY2hub2xvZ3kncyB2ZXJzaW9uIG9mIENvbXBvbmVudCBQYXNjYWwgaGFzXHBhcg0KdHdvIG1p
bm9yIGVuaGFuY2VtZW50cyB3aGljaCBoZWxwcyB0byBhZGRyZXNzIHRoaXMgc29ydCBvZiBwcm9i
bGVtLiBUaGV5XHBhcg0KaGF2ZSBvbmUgdW5zaWduZWQgdHlwZSBVQllURSwgYW5kIGFuIFtVTkNI
RUNLRURfQVJJVEhNRVRJQ10gZGlyZWN0aXZlIHRvXHBhcg0KYXZvaWQgaW50ZWdlciBvdmVyZmxv
dyB0cmFwcy4gSSBoYWQgdG8gdXNlIHRoaXMgcmVjZW50bHkgd2hlbiByZWFkaW5nXHBhcg0KZnJv
bSBhIGZvcmVpZ24gZmlsZSBjb250YWluaW5nIGEgbWl4dHVyZSBvZiBieXRlLXNpemVkIGFuZCBp
bnRlZ2VyLXNpemVkXHBhcg0KcXVhbnRpdGllcy4gVXNpbmcgdGhlc2UgZmVhdHVyZXMgcmVzdWx0
IGluIHRoaXMgc29ydCBvZiBjb2RlOlxwYXINClxwYXINClRZUEVccGFyDQogIFJlYWRlciogPSBQ
T0lOVEVSIFRPIFJFQ09SRFxwYXINCiAgICBmOiBCRi5GSUxFO1xwYXINCiAgICBCdWZmZXI6IFBP
SU5URVIgVE8gQVJSQVkgT0YgVUJZVEU7XHBhcg0KICAgIEN1cnNvciwgRmlsZVNpemU6IElOVEVH
RVI7XHBhcg0KICBFTkQ7XHBhcg0KXHBhcg0KUFJPQ0VEVVJFIChyZDogUmVhZGVyKSBSZWFkQnl0
ZSgpOiBVQllURSwgTkVXO1xwYXINCkJFR0lOXHBhcg0KICBJTkMocmQuQ3Vyc29yKTtccGFyDQog
IFJFVFVSTiByZC5CdWZmZXJbcmQuQ3Vyc29yXTtccGFyDQpFTkQgUmVhZEJ5dGU7XHBhcg0KXHBh
cg0KUFJPQ0VEVVJFIChyZDogUmVhZGVyKSBSZWFkU2hvcnQqKE9VVCB3OiBTSE9SVElOVCksIE5F
VztccGFyDQpCRUdJTlxwYXINCiAgdyA6PSBTSE9SVCgocmQuUmVhZEJ5dGUoKSAqIDI1NikgKyBy
ZC5SZWFkQnl0ZSgpKTtccGFyDQpFTkQgUmVhZFNob3J0O1xwYXINClxwYXINClBST0NFRFVSRSAo
cmQ6IFJlYWRlcikgUmVhZEludChPVVQgaW50OiBJTlRFR0VSKSwgTkVXO1xwYXINClZBUlxwYXIN
CiAgaTogSU5URUdFUjtccGFyDQpCRUdJTiBbVU5DSEVDS0VEX0FSSVRITUVUSUNdXHBhcg0KICBp
bnQgOj0gMDtccGFyDQogIEZPUiBpIDo9IDEgVE8gNCBET1xwYXINCiAgICBpbnQgOj0gaW50ICog
MjU2ICsgcmQuUmVhZEJ5dGUoKTtccGFyDQogIEVORDtccGFyDQpFTkQgUmVhZEludDtccGFyDQpc
cGFyDQpNYXliZSBCbGFja0JveCBjb3VsZCBjb25zaWRlciBpbmNvcnBvcmF0aW5nIHRoZSBzYW1l
IG9yIHNpbWlsYXJccGFyDQplbmhhbmNlbWVudHMuXHBhcg0KXHBhcg0KQ2hyaXMgQnVycm93c1xw
YXINCkNGQiBTb2Z0d2FyZVxwYXINCmh0dHA6Ly93d3cuY2Zic29mdHdhcmUuY29tXHBhcg0KXHBh
cg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLVxwYXINCj4gRnJvbTogV29qdGVrIFNrdWxz
a2kgW21haWx0bzpza3Vsc2tpQHBhcy5yb2NoZXN0ZXIuZWR1XSBccGFyDQo+IFNlbnQ6IE1vbmRh
eSwgMTcgTm92ZW1iZXIgMjAwMyA4OjE0QU1ccGFyDQo+IFRvOiBCZXJuaGFyZCBUcmV1dHdlaW5c
cGFyDQo+IENjOiBCbGFja0JveFxwYXINCj4gU3ViamVjdDogUmU6IFVuc2lnbmVkIGludGVnZXIg
bWF0aCBpbiBCbGFja0JveFxwYXINCj4gXHBhcg0KPiBccGFyDQo+IEJlcm5hcmQ6XHBhcg0KPiBc
cGFyDQo+IHRoYW5rIHlvdSBmb3IgcmVtaW5kaW5nIG1lIG9mIHVuaW9ucyBpbiBTWVNURU0uIEkg
d2lsbCBhZGQgXHBhcg0KPiB1bmlvbnMgdG8gbXkgYmFnIG9mIHRyaWNrcywgdGhvdWdoIHRoZSBz
cGlyaXQgb2YgQkIvQ1AgXHBhcg0KPiBwcm9oaWJpdHMgdXNpbmcgU1lTVEVNIHVubGVzcyBhYnNv
bHV0ZWx5IG5lY2Vzc2FyeS5ccGFyDQo+IFxwYXINCj4gVGhlcmUgaXMgYWN0dWFsbHkgYSB0aGly
ZCB3YXksIHRoYXQgaXMgcHJvdmlkaW5nIGdvb2QgXHBhcg0KPiBhcHBsaWNhdGlvbiBub3RlcyBk
ZWFsaW5nIHdpdGggc3VjaCBsb3ctbGV2ZWwgaXNzdWVzLiBccGFyDQo+IEJsYWNrQm94IHZlbmRv
ciBpcyBvbmUgb2YgZmV3IHZlbmRvcnMgSSBrbm93IG9mIHdobyBkbyBub3QgXHBhcg0KPiBib3Ro
ZXIgdG8gd3JpdGUgYXBwbGljYXRpb24gbm90ZXMgYW5kIHJlZmVyZW5jZSBtYXRlcmlhbHMuIFxw
YXINCj4gVGhlIHF1YWxpdHkgb2YgdGhlIGNvbXBpbGVyIGlzIG91dHN0YW5kaW5nLCBidXQgdGhl
IHF1YWxpdHkgXHBhcg0KPiBvZiBpdHMgc3Vycm91bmRpbmcgZG9jdW1lbnRhdGlvbiAtLSB3ZWxs
LCB3ZSBhbGwga25vdy4gSSBoYWQgXHBhcg0KPiB0byBwYWluZnVsbHkgcmVpbnZlbnQgdGhpbmdz
IHdoaWNoIG1vc3QgbGlrZWx5IGFyZSB3ZWxsIGtub3duIFxwYXINCj4gYnV0IHVuZG9jdW1lbnRl
ZC5ccGFyDQo+IFxwYXINCj4gV29qdGVrIFNrdWxza2kgc2t1bHNraUBwYXMucm9jaGVzdGVyLmVk
dVxwYXINCj4gT24gU3VuLCAxNiBOb3YgMjAwMywgQmVybmhhcmQgVHJldXR3ZWluIHdyb3RlOlxw
YXINCj4gXHBhcg0KPiA+IERlYXIgV29qdGVrLFxwYXINCj4gPlxwYXINCj4gPiBvbiB0aGUgb25l
IGhhbmQgSSBhZ3JlZSBhYnNvbHV0ZWx5IHRoYXQgdW5zaWduZWQgc2hvdWxkIGJlIFxwYXINCj4g
YXZhaWxhYmxlIFxwYXINCj4gPiAoYXQgbGVhc3QgaW4gU1lTVEVNIG9yIHNvbWUgb3RoZXIgbG93
IGxldmVsIG1vZHVsZSkuIEl0IGlzIFxwYXINCj4gbmVjZXNzYXJ5IFxwYXINCj4gPiBmb3IgaW50
ZXJmYWNpbmcgLi4uXHBhcg0KPiA+XHBhcg0KPiA+IGJ1dCBvbiB0aGUgb3RoZXIgaGFuZCB5b3Vy
IHByb2JsZW0gbWlnaHQgYmUgZWFzaWx5IHNvbHZlZCBccGFyDQo+IGJ5IGFwcGx5aW5nIFxwYXIN
Cj4gPiBsb3cgbGV2ZWwgc3lzdGVtIHRhZyAidW5pb24iIGFuZCBkb2luZyB0aGUgb2xkIGFuZCBk
aXJ0eSB0cmljayBvZiBccGFyDQo+ID4gb3ZlcmxheWluZyBkaWZmZXJlbnQgc3RydWN0dXJlcyBv
biB0aGUgc2FtZSBtZW1vcnk6XHBhcg0KPiA+XHBhcg0KPiA+IElNUE9SVCBTWVNURU07XHBhcg0K
PiA+XHBhcg0KPiA+IFRZUEVccGFyDQo+ID5ccGFyDQo+ID4gRGlydCA9IFJFQ09SRCBbIHVuaW9u
IF1ccGFyDQo+ID4gICAgIGkgOiBJTlRFR0VSO1xwYXINCj4gPiAgICAgaCwgbCA6IEJZVEUgICgq
IG1heWJlIGFsc28gdGhlIG90aGVyIHdheSByb3VuZCwgaS5lLiwgXHBhcg0KPiBsLCBoICopIEVO
RDtccGFyDQo+ID5ccGFyDQo+ID4gVkFSXHBhcg0KPiA+ICAgICBkaXJ0eSA6IERpcnQ7XHBhcg0K
PiA+XHBhcg0KPiA+IC4uLlxwYXINCj4gPiAgICAgZGlydHkuaCA6PSBieXRlOyBkaXJ0eS5sIDo9
IGJ5dGU7XHBhcg0KPiA+ICAgICBtZW1QdHIgOj0gZGlydHkuaTtccGFyDQo+ID4gLi4uXHBhcg0K
PiA+XHBhcg0KPiA+IEkga25vdyB0aGlzIGlzIGFnYWluc3QgdGhlIHNwaXJpdCBvZiBCQi9DUCwg
YnV0IGluIHRoZSBjYXNlIG9mIFxwYXINCj4gPiBoYXJkd2FyZSBpbnRlcmZhY2luZy9sYW5ndWFn
ZSBpbnRlcmZhY2luZyBhbG1vc3QgYW55dGhpbmcgXHBhcg0KPiBzYWNyaWZpY2VzIFxwYXINCj4g
PiB0aGUgbWVhbnMgdXNlZC5ccGFyDQo+ID5ccGFyDQo+ID5ccGFyDQo+ID4gLS0tLS0gT3JpZ2lu
YWwgTWVzc2FnZSAtLS0tLVxwYXINCj4gPiBGcm9tOiAiV29qdGVrIFNrdWxza2kiIDxza3Vsc2tp
QHBhcy5yb2NoZXN0ZXIuZWR1PlxwYXINCj4gPiBUbzogIkJsYWNrQm94IiA8YmxhY2tib3hAb2Jl
cm9uLmNoPlxwYXINCj4gPiBDYzogIldvanRlayBTa3Vsc2tpIiA8c2t1bHNraUBwYXMucm9jaGVz
dGVyLmVkdT5ccGFyDQo+ID4gU2VudDogU3VuZGF5LCBOb3ZlbWJlciAxNiwgMjAwMyA2OjA0IFBN
XHBhcg0KPiA+IFN1YmplY3Q6IFVuc2lnbmVkIGludGVnZXIgbWF0aCBpbiBCbGFja0JveFxwYXIN
Cj4gPlxwYXINCj4gPlxwYXINCj4gPiA+IEhlbGxvOlxwYXINCj4gPiA+XHBhcg0KPiA+ID4gIEkg
anVzdCByZWFjaGVkIGEgY29uY2x1c2lvbiwgdGhhdCBsYWNrIG9mIHVuc2lnbmVkIFxwYXINCj4g
aW50ZWdlciBtYXRoIGluIFxwYXINCj4gPiA+IEJsYWNrQm94IGlzIGEgcm95YWwgcGFpbiBpbiB0
aGUgYm90dG9tLiBJZiBub3QgZm9yIG15IFxwYXINCj4gcmVzcGVjdCB0byBvdXIgXHBhcg0KPiA+
ID4gT3VTIGZyaWVuZHMsIEkgd291bGQgaGF2ZSB1c2VkIG1vcmUgZXhwbGljaXQgbGFuZ3VhZ2Ug
dG8gZGVzY3JpYmUgXHBhcg0KPiA+ID4gdGhlaXIgbGFuZ3VhZ2UgZGVzaWduIGRlY2lzaW9uLlxw
YXINCj4gPiA+XHBhcg0KPiA+ID4gSGVyZSBpcyB0aGUgc3RvcnkuIEZvciBsYXN0IHRocmVlIGRh
eXMgSSBoYXMgY2hhc2luZyBccGFyDQo+IG1pc3NpbmcgYml0cyBpbiBccGFyDQo+ID4gPiB0aGUg
bWVtb3J5IHBvaW50ZXIgd2hpY2ggSSByZWFkIGZyb20gYW4gZmllbGQtcHJvZ3JhbW1hYmxlIGdh
dGUgXHBhcg0KPiA+ID4gYXJyYXkuIEFzIHVzdWFsIGluIHN1Y2ggY2lyY3Vtc3RhbmNlcywgSSB3
YXMgc3VzcGVjdGluZyBiYWQgRlBHQSBccGFyDQo+ID4gPiB0aW1pbmcsIG9yIGJ1Z3MgaW4gdGhl
IGVtYmVkZGVkIG1pY3JvY29udHJvbGxlciBDLWNvZGUsIFxwYXINCj4gb3IgcGVyaGFwcyBccGFy
DQo+ID4gPiBiYWQgc29sZGVyIGpvaW50cyBvbiBteSBQQ0IuIEl0IGRpZCBub3Qgb2NjdXIgdG8g
bWUgdGhhdCBvdXIgXHBhcg0KPiA+ID4gcm9jay1zb2xpZCBCbGFja0JveCBjYW4gaW50cm9kdWNl
IHN1YnRsZSBidWdzLiBSaWdodD8gXHBhcg0KPiBXcm9uZy4gSXQgY2FuIFxwYXINCj4gPiA+IGFu
ZCBpdCBkaWQuIEhlcmUgaXMgaG93LlxwYXINCj4gPiA+XHBhcg0KPiA+ID4gVGhlIEZQR0EgbWVt
b3J5IHBvaW50ZXIgaXMgcmVhZCBpbiB0d28gOC1iaXQgY2h1bmtzLCBhbiBccGFyDQo+IE1TQiBh
bmQgTFNCLiBccGFyDQo+ID4gPiBUaGUgTFNCIGNvbnRhaW5zIGxvd2VyIDggYml0cywgd2hpbGUg
dGhlIE1TQiBjb250YWlucyB0aGUgXHBhcg0KPiByZW1haW5pbmcgXHBhcg0KPiA+ID4gYml0cy4g
VGhlIE1TQiBhbmQgTFNCIGFycml2ZSBpbiBhIGJ5dGUgYnVmZmVyLCBhbmQgdGhlbiB0aGV5IGFy
ZSBccGFyDQo+ID4gPiBjb21iaW5lZCBpbiB0aGUgUEMgaW50byBvbmUgd29yZC4gV3JpdHRlbiBp
biB0aGUgKHZhc3RseSBpbmZlcmlvciBccGFyDQo+ID4gPiBhbmQga25vd24gZm9yIGl0cyBvYnNj
dXJpdHkpIEMtbGFuZ3VhZ2UgdGhpcyB3b3VsZCBoYXZlIFxwYXINCj4gYmVlbiBzaW1wbGU6XHBh
cg0KPiA+ID5ccGFyDQo+ID4gPiAgIHVuc2lnbmVkIGNoYXIgbHNiLCBtc2I7XHBhcg0KPiA+ID4g
ICB1bnNpZ25lZCBpbnQgbWVtUHRyO1xwYXINCj4gPiA+ICAgbXNiID0gYnVmZmVyIFsyXTtccGFy
DQo+ID4gPiAgIGxzYiA9IGJ1ZmZlciBbM107XHBhcg0KPiA+ID4gICBtZW1QdHIgPSAobXNiIDw8
IDgpICsgbHNiO1xwYXINCj4gPiA+XHBhcg0KPiA+ID4gSW4gdGhlICh2YXN0bHkgc3VwZXJpb3Ig
YW5kIGtub3duIGZvciBpdHMgY2xhcml0eSkgXHBhcg0KPiBDb21wb25lbnQgUGFzY2FsIFxwYXIN
Cj4gPiA+IEkgaGF2ZSB3cml0dGVuIGNvZGUsIHdoaWNoIEkgdGhvdWdodCB3YXMgZG9pbmcgdGhl
IHNhbWUgdGhpbmcuXHBhcg0KPiA+ID5ccGFyDQo+ID4gPiAgICBWQVIgYnVmZmVyOiBBUlJBWSAy
NTYgb2YgQllURTtccGFyDQo+ID4gPiAgICAgICAgbWVtUHRyOiBJTlRFR0VSO1xwYXINCj4gPiA+
ICAgIG1lbVB0ciA6PSAgQVNIIChidWZmZXIgWzJdLCA4KSArIGJ1ZmZlciBbM107XHBhcg0KPiA+
ID5ccGFyDQo+ID4gPiBUaGlzIGlzIG5pY2UgYW5kIGxvb2tzIGlubm9jZW50IGVub3VnaC4gVGhl
biB0aGUgaGVsbCBccGFyDQo+IGJyb2tlIGxvb3NlLiBccGFyDQo+ID4gPiBTb21ldGltZXMgdGhl
IG1lbW9yeSBwb2ludGVyIHdhcyBjb3JyZWN0LiBCdXQgc29tZXRpbWVzIFxwYXINCj4gaXQgd2Fz
IG5vdC4gXHBhcg0KPiA+ID4gU29tZXRpbWVzLCBidXQgbm90IGFsd2F5cywgYml0cyB3ZXJlIG1p
c3NpbmcgaW4gdGhlIHVwcGVyIHBhcnQgb2YgXHBhcg0KPiA+ID4gdGhlIHBvaW50ZXIuIEFmdGVy
IHRocmVlIGRheXMgb2YgZGVidWdnaW5nIGl0IHR1cm5lZCBvdXQgdGhhdCB0aGUgXHBhcg0KPiA+
ID4gY29ycmVjdCBjb2RlIHNob3VsZCBoYXZlIGJlZW46XHBhcg0KPiA+ID5ccGFyDQo+ID4gPiAg
IFZBUiAgbHNiLCBtc2I6IElOVEVHRVI7XHBhcg0KPiA+ID4gICAgICAgIGJ1ZmZlcjogQVJSQVkg
MjU2IG9mIEJZVEU7XHBhcg0KPiA+ID4gICAgICAgIG1lbVB0cjogSU5URUdFUjtccGFyDQo+ID4g
PiAgIG1zYiAgOj0gT1JEIChCSVRTIChBU0ggKGJ1ZmZlciBbMl0sIDgpKSAqIFx7OC4uMTVcfSk7
XHBhcg0KPiA+ID4gICBsc2IgIDo9IE9SRCAoQklUUyAoYnVmZmVyIFszXSkgKiBcezAuLjdcfSk7
XHBhcg0KPiA+ID4gICBtZW1QdHIgOj0gIG1zYiArIGxzYjtccGFyDQo+ID4gPlxwYXINCj4gPiA+
IEkgbGVhdmUgaXQgdG8geW91IHRvIGZpZ3VyZSBvdXQgd2h5IHRoaXMgb2JmdXNjYXRlZCBjb2Rl
IGlzIHRoZSBccGFyDQo+ID4gPiBjb3JyZWN0IENQIHZlcnNpb24gb2YgIihtc2IgPDwgOCkgKyBs
c2IiLiBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBccGFyDQo+ID4gPiBub3RlIHRoYXQgdGhlIGJ1
ZyB3YXMgc2hvd2luZyBvbmx5IGZvciBzb21lIGJpdCBwYXR0ZXJucywgYnV0IG5vdCBccGFyDQo+
ID4gPiBmb3IgdGhlIG90aGVycywgd2hhdCBtYWRlIGl0IGV4Y2VwdGlvbmFsbHkgaGFyZCB0byBk
ZWJ1ZyB0aGUgXHBhcg0KPiA+ID4gb3JpZ2luYWwgQ1AgY29kZS5ccGFyDQo+ID4gPlxwYXINCj4g
PiA+IEkgd2FudCB0byBwb2ludCBvdXQgdGhhdCB0aGUgQ1AgbGFuZ3VhZ2UgaXMgbm90IGNvbXBs
ZXRlLiBUaGUgXHBhcg0KPiA+ID4gdW5zaWduZWQgbWF0aCBzaG91bGQgaGF2ZSBiZWVuIHRoZXJl
LiBUaGUgdXNlcnMgaGF2ZSBiZWVuIGFyZ3VpbmcgXHBhcg0KPiA+ID4gd2l0aCBPdVMgZm9yIHll
YXJzIHRoYXQgdGhlIHVuc2lnbmVkIG1hdGggaXMgZXNzZW50aWFsLCBccGFyDQo+IGFsbCBpbiB2
YWluLiBccGFyDQo+ID4gPiBJIGhvcGUgdGhhdCBJIGhhdmUgbWFkZSBpdCBtb3JlIGNsZWFyIHdo
eSB0aGUgdW5zaWduZWQgXHBhcg0KPiBzaG91bGQgaGF2ZSBccGFyDQo+ID4gPiBiZWVuIGluIHRo
ZSBsYW5ndWFnZS5ccGFyDQo+ID4gPlxwYXINCj4gPiA+IFRoYW5rIHlvdSxccGFyDQo+ID4gPlxw

YXINCj4gPiA+IFdvanRlayBTa3Vsc2tpIHNrdWxza2lAcGFzLnJvY2hlc3Rlci5lZHVccGFyDQo+
ID4gPlxwYXINCj4gPiA+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tXHBhcg0KPiA+ID5ccGFyDQo+ID4gPiBUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbWFpbGlu
ZyBsaXN0LCBzZW5kIGEgbWVzc2FnZSBccGFyDQo+IGNvbnRhaW5pbmcgdGhlIFxwYXINCj4gPiA+
IHdvcmRccGFyDQo+ID4gInVuc3Vic2NyaWJlIiB0bzpccGFyDQo+ID4gPiAgICBibGFja2JveC1y
ZXF1ZXN0QG9iZXJvbi5jaFxwYXINCj4gPiA+XHBhcg0KPiA+ID4gVG8gZ2V0IGEgbGlzdCBvZiB2
YWxpZCBlLW1haWwgY29tbWFuZHMgYW5kIGluc3RydWN0aW9ucyBvbiB0aGVpciBccGFyDQo+ID4g
PiB1c2FnZSxccGFyDQo+ID4gc2VuZCBhIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgd29yZCAiaGVs
cCIgdG8gdGhlIGFib3ZlIGFkZHJlc3MuXHBhcg0KPiA+ID5ccGFyDQo+ID4gPiBTZW5kIGFueSBw
cm9ibGVtIHJlcG9ydHMgb3IgcXVlc3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBccGFyDQo+IGVtYWls
IGxpc3QgdG8gXHBhcg0KPiA+ID4gdGhlXHBhcg0KPiA+IGxpc3Qgb3duZXIgYXRccGFyDQo+ID4g
PiAgICBvd25lci1ibGFja2JveEBvYmVyb24uY2hccGFyDQo+ID4gPlxwYXINCj4gPiA+IEN1cnJl
bnQgcG9zdGluZyBwb2xpY3k6XHBhcg0KPiA+ID5ccGFyDQo+ID4gPiBhKSBUbyBwb3N0IHlvdSBz
aG91bGQgdXNlIHRoZSBzYW1lIGFkZHJlc3MgYnkgd2hpY2ggeW91IGFyZSBccGFyDQo+ID4gPiBz
dWJzY3JpYmVkIHRvXHBhcg0KPiA+IHRoZSBtYWlsaW5nIGxpc3QuIFRoYXQgd2F5LCB0aGUgbGlz
dCBzZXJ2ZXIgd2lsbCByZWNvZ25pemUgeW91IGFzIFxwYXINCj4gPiBzdWJzY3JpYmVyIGFuZCBm
b3J3YXJkIHlvdXIgcG9zdGluZyBpbW1lZGlhdGVseSwgd2l0aG91dCBccGFyDQo+IGNyZWF0aW5n
IGFueSBccGFyDQo+ID4gb3ZlcmhlYWQuXHBhcg0KPiA+ID5ccGFyDQo+ID4gPiBiKSBJZiwgZm9y
IHNvbWUgcmVhc29uLCB5b3UgY2Fubm90IHBvc3QgZnJvbSB0aGUgYWRkcmVzcywgXHBhcg0KPiBi
eSB3aGljaCBccGFyDQo+ID4gPiB5b3UgYXJlXHBhcg0KPiA+IHN1YnNjcmliZWQsIHlvdXIgbWVz
c2FnZSB3aWxsIGJlIG1vZGVyYXRlZCB0byBhdm9pZCBzcGFtLiBQbGVhc2UgXHBhcg0KPiA+IHVu
ZGVyc3RhbmQgdGhhdCBtb2RlcmF0aW9uIHdpbGwgb2Z0ZW4gY2F1c2Ugc29tZSBkZWxheSwgaW4g
XHBhcg0KPiBwYXJ0aWN1bGFyIFxwYXINCj4gPiBvdmVyIHdlZWtlbmRzIG9yIGhvbHlkYXlzLlxw
YXINCj4gPlxwYXINCj4gPlxwYXINCj4gPlxwYXINCj4gXHBhcg0KPiAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxwYXINCj4gXHBhcg0KPiBUbyB1bnN1YnNjcmli
ZSBmcm9tIHRoaXMgbWFpbGluZyBsaXN0LCBzZW5kIGEgbWVzc2FnZSBccGFyDQo+IGNvbnRhaW5p
bmcgdGhlIHdvcmQgInVuc3Vic2NyaWJlIiB0bzpccGFyDQo+ICAgIGJsYWNrYm94LXJlcXVlc3RA
b2Jlcm9uLmNoXHBhcg0KPiBccGFyDQo+IFRvIGdldCBhIGxpc3Qgb2YgdmFsaWQgZS1tYWlsIGNv
bW1hbmRzIGFuZCBpbnN0cnVjdGlvbnMgb24gXHBhcg0KPiB0aGVpciB1c2FnZSwgc2VuZCBhIG1l
c3NhZ2UgY29udGFpbmluZyB0aGUgd29yZCAiaGVscCIgdG8gdGhlIFxwYXINCj4gYWJvdmUgYWRk
cmVzcy5ccGFyDQo+IFxwYXINCj4gU2VuZCBhbnkgcHJvYmxlbSByZXBvcnRzIG9yIHF1ZXN0aW9u
cyByZWxhdGVkIHRvIHRoaXMgZW1haWwgXHBhcg0KPiBsaXN0IHRvIHRoZSBsaXN0IG93bmVyIGF0
XHBhcg0KPiAgICBvd25lci1ibGFja2JveEBvYmVyb24uY2hccGFyDQo+IFxwYXINCj4gQ3VycmVu
dCBwb3N0aW5nIHBvbGljeTpccGFyDQo+IFxwYXINCj4gYSkgVG8gcG9zdCB5b3Ugc2hvdWxkIHVz
ZSB0aGUgc2FtZSBhZGRyZXNzIGJ5IHdoaWNoIHlvdSBhcmUgXHBhcg0KPiBzdWJzY3JpYmVkIHRv
IHRoZSBtYWlsaW5nIGxpc3QuIFRoYXQgd2F5LCB0aGUgbGlzdCBzZXJ2ZXIgXHBhcg0KPiB3aWxs
IHJlY29nbml6ZSB5b3UgYXMgc3Vic2NyaWJlciBhbmQgZm9yd2FyZCB5b3VyIHBvc3RpbmcgXHBh
cg0KPiBpbW1lZGlhdGVseSwgd2l0aG91dCBjcmVhdGluZyBhbnkgb3ZlcmhlYWQuXHBhcg0KPiBc
cGFyDQo+IGIpIElmLCBmb3Igc29tZSByZWFzb24sIHlvdSBjYW5ub3QgcG9zdCBmcm9tIHRoZSBh
ZGRyZXNzLCBieSBccGFyDQo+IHdoaWNoIHlvdSBhcmUgc3Vic2NyaWJlZCwgeW91ciBtZXNzYWdl
IHdpbGwgYmUgbW9kZXJhdGVkIHRvIFxwYXINCj4gYXZvaWQgc3BhbS4gUGxlYXNlIHVuZGVyc3Rh
bmQgdGhhdCBtb2RlcmF0aW9uIHdpbGwgb2Z0ZW4gXHBhcg0KPiBjYXVzZSBzb21lIGRlbGF5LCBp
biBwYXJ0aWN1bGFyIG92ZXIgd2Vla2VuZHMgb3IgaG9seWRheXMuXHBhcg0KPiBccGFyDQpccGFy
DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxwYXINClxwYXIN
ClRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBtYWlsaW5nIGxpc3QsIHNlbmQgYSBtZXNzYWdlIGNv
bnRhaW5pbmcgdGhlIHdvcmQgInVuc3Vic2NyaWJlIiB0bzpccGFyDQogICBibGFja2JveC1yZXF1
ZXN0QG9iZXJvbi5jaFxwYXINClxwYXINClRvIGdldCBhIGxpc3Qgb2YgdmFsaWQgZS1tYWlsIGNv
bW1hbmRzIGFuZCBpbnN0cnVjdGlvbnMgb24gdGhlaXIgdXNhZ2UsIHNlbmQgYSBtZXNzYWdlIGNv
bnRhaW5pbmcgdGhlIHdvcmQgImhlbHAiIHRvIHRoZSBhYm92ZSBhZGRyZXNzLlxwYXINClxwYXIN
ClNlbmQgYW55IHByb2JsZW0gcmVwb3J0cyBvciBxdWVzdGlvbnMgcmVsYXRlZCB0byB0aGlzIGVt
YWlsIGxpc3QgdG8gdGhlIGxpc3Qgb3duZXIgYXRccGFyDQogICBvd25lci1ibGFja2JveEBvYmVy
b24uY2hccGFyDQpccGFyDQpDdXJyZW50IHBvc3RpbmcgcG9saWN5OlxwYXINClxwYXINCmEpIFRv
IHBvc3QgeW91IHNob3VsZCB1c2UgdGhlIHNhbWUgYWRkcmVzcyBieSB3aGljaCB5b3UgYXJlIHN1
YnNjcmliZWQgdG8gdGhlIG1haWxpbmcgbGlzdC4gVGhhdCB3YXksIHRoZSBsaXN0IHNlcnZlciB3
aWxsIHJlY29nbml6ZSB5b3UgYXMgc3Vic2NyaWJlciBhbmQgZm9yd2FyZCB5b3VyIHBvc3Rpbmcg
aW1tZWRpYXRlbHksIHdpdGhvdXQgY3JlYXRpbmcgYW55IG92ZXJoZWFkLlxwYXINClxwYXINCmIp
IElmLCBmb3Igc29tZSByZWFzb24sIHlvdSBjYW5ub3QgcG9zdCBmcm9tIHRoZSBhZGRyZXNzLCBi
eSB3aGljaCB5b3UgYXJlIHN1YnNjcmliZWQsIHlvdXIgbWVzc2FnZSB3aWxsIGJlIG1vZGVyYXRl
ZCB0byBhdm9pZCBzcGFtLiBQbGVhc2UgdW5kZXJzdGFuZCB0aGF0IG1vZGVyYXRpb24gd2lsbCBv
ZnRlbiBjYXVzZSBzb21lIGRlbGF5LCBpbiBwYXJ0aWN1bGFyIG92ZXIgd2Vla2VuZHMgb3IgaG9s
eWRheXMuXHBhcg0KfX0Ab21tYQ==


----boundary-LibPST-iamunique-686755198_-_---
Received on Mon Nov 17 2003 - 03:13:54 UTC

This archive was generated by hypermail 2.3.0 : Thu Sep 26 2013 - 06:29:02 UTC