Less talk

[email protected] (Alex Gough) Mon, 11 Feb 2002 23:02:30 +0000 (GMT)
Newsgroups perl.perl6.internals.bignum
Message-ID <[email protected]>
---556882451-1518492776-1013468550=:541
Content-Type: TEXT/PLAIN; charset=US-ASCII

I've been playing around a bit and have come up with the attached files,
the library isn't quite the same as those I've seen proposed before
mainly because

 1) Only one stream of digits is kept for each number, with negative
    exponents signifying some digits below the decimal point.  This
    simplifies the arithmetic greatly.

 2) I've implemented all the internal functions myself, more because
    I wanted to start with a collection that worked.  These should be
    replaced / reworked to use efficient methods (so long as they remain
    correct).

 3) I've written this with the goal of supporting IBM's Base Standard
    Arithmetic, although I expect that *in general* perl6 will not need
    these features, it will make writing a library that does trivial.
    Also, perl6 may well want to warn in places where the standard
    suggests an exception, such as loss of digits during rounding.

  4) With appropriate fiddling with precision (such as using negative
     values) the same API can support BigInts as well as BigFloats.

  5) I'd like very much to be able to back-port this into perl5 as it
     lacks a decimal arithmetic library, so have at present wrapped
     appropriate things in macros, and expect parrot to provide an
     additional .c file which will provide a less stringent string
     conversion, and string output which supports locales and what
     have you.

Notes on the source:

PINTD_ is used where a parrot interpreter might be a function parameter
PINT_  is used where a parrot interpreter might be a function argument

The source uses INTVALs and the like, these would be the appropriate
parrot typedefs, but when not in parrot, should be something sensible.

The various #defined limts I've got at the moment are merely for the
sake of having something.

It isn't entirely finished, BN_rescale and BN_power aren't done yet.

The exception handling isn't quite right, BN_EXCEPT will want to set
some sort of flags on the current context (when living as a C
library), although I'm not entirely sure how yet.  When being used in
parrot, I expect that the parrot exception mechanism will be followed.
Also, some operations might want to continue past errors, returning
say +Inf, which isn't included yet.

And, once more, I know I've started from scratch, but I did so as so
far little has been done, and what has been done should be easily
fitted into this framework.  Consider this more of a suggested API.

Alex Gough
-- 
We all do what we do, just to get by.
We all see what we see, not to ask why.
We will look the other way, when you walk by.
So don't ask us tomorrow, who did the crime?

---556882451-1518492776-1013468550=:541
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="bignum.c"
Content-Transfer-Encoding: BASE64
Content-ID: <[email protected]>
Content-Description: bignum.c
Content-Disposition: attachment; filename="bignum.c"

LyoNCiAgJElkJA0KDQogIGJpZ251bS5jIC0tIEEgZGVjaW1hbCBhcml0aG1l
dGljIGxpYnJhcnkgZm9yIFBlcmwgYW5kIFBhcnJvdA0KDQogIFRoaXMgY29k
ZSBpcyBpbnRlbmRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBwYXJyb3QgcHJv
amVjdCwgYW5kIGFsc28NCiAgZm9yIGJhY2twb3J0aW5nIGludG8gUGVybDUg
KGFzIGEgQ1BBTiBtb2R1bGUpLiAgQW55IHBhdGNoZXMgdG8gdGhpcw0KICBj
b2RlIHdpbGwgbGlrZWx5IGZpbmQgdGhlaXIgd2F5IGJhY2sgdG8gdGhlIE1v
dGhlciBTaGlwLCBhcyBpdCB3ZXJlLg0KDQogIFRoZXJlIGlzIGEgZ29vZCBk
ZWFsIG9mIHNjb3BlIGZvciBpbXByb3ZpbmcgdGhlIHNwZWVkIG9mIHRoaXMg
Y29kZSwNCiAgbW9kaWZpY2F0aW9ucyBhcmUgZW5jb3VyYWdlZCBhcyBsb25n
IGFzIHRoZSBleHRlbmRlZCByZWdyZXNzaW9ucyB0ZXN0cw0KICBjb250aW51
ZSB0byBwYXNzLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBBbGV4IEdvdWdoLCAyMDAyDQoNCiAg
VGhpcyBjb2RlIGlzIGNvcHlyaWdodCBZZXQgQW5vdGhlciBTb2NpZXR5IDIw
MDIuDQoNCiovDQoNCi8qDQogIEl0IHdhcyBhIHZlcnkgaW5jb252ZW5pZW50
IGhhYml0IG9mIGtpdHRlbnMgKEFsaWNlIGhhZCBvbmNlIG1hZGUgdGhlDQog
IHJlbWFyaykgdGhhdCwgd2hhdGV2ZXIgeW91IHNheSB0byB0aGVtLCB0aGV5
IGFsd2F5cyBwdXJyLiAgIklmIHRoZXkNCiAgd291bGQgb25seSBwdXJyIGZv
ciBgeWVzLCcgYW5kIG1ldyBmb3IgYG5vLCcgb3IgYW55IHJ1bGUgb2YgdGhh
dA0KICBzb3J0LCIgc2hlIGhhZCBzYWlkLCAic28gdGhhdCBvbmUgY291bGQg
a2VlcCB1cCBhIGNvbnZlcnNhdGlvbiEgIEJ1dA0KICBob3cgY2FuIHlvdSB0
YWxrIHdpdGggYSBwZXJzb24gaWYgdGhleSBhbHdheXMgc2F5IHRoZSBzYW1l
IHRoaW5nPyINCg0KICBPbiB0aGlzIG9jY2FzaW9uIHRoZSBraXR0ZW4gb25s
eSBwdXJyZWQ6IGFuZCBpdCB3YXMgaW1wb3NzaWJsZSB0bw0KICBndWVzcyB3
aGV0aGVyIGl0IG1lYW50IGB5ZXMnIG9yIGBubycuDQoqLw0KDQojaW5jbHVk
ZSA8c3RkaW8uaD4NCiNpbmNsdWRlICJiaWdudW0uaCINCiNpbmNsdWRlIDxh
c3NlcnQuaD4NCg0KLyo9aGVhZDEgV2hlbiBpbiBwYXJyb3QNCg0KV2hlbiB0
aGUgbGlicmFyeSBpcyB1c2VkIHdpdGhpbiBwYXJyb3QsIGFsbCBjYWxscyBl
eHBlY3QgYW4gYWRkaXRpb25hbA0KZmlyc3QgYXJndW1lbnQgb2YgYW4gaW50
ZXJwcmV0ZXIsIGZvciB0aGUgcHVycG9zZXMgb2YgbWVtb3J5IGFsbG9jYXRp
b24sDQpzb21lIGludGVybmFsIG1hY3JvcyBkbyBub3QgKGdldGQvc2V0ZCBh
bmQgQ0hFQ0soT3xVKUZMT1cuDQoNCklmIHlvdSdyZSBiZWluZyB1c2VmdWwg
YW5kIGluc2VydGluZyBwcm9wZXIgcmFwaWQgZmlsbGlucywgc3RhcnQNCndp
dGggdGhlIEJOX2kqIG1ldGhvZHMsIGJ1dCBtYWtlIHN1cmUgYW55IGVycm9y
cyBjYW4gc3RpbGwgYmUNCnRocm93bi4NCg0KPWhlYWQyIFRPRE8NCg0KUGFy
cm90IHN0cmluZyBwbGF5aW5nLCBleGNlcHRpb24gcmFpc2luZw0KDQoqLw0K
DQovKiBBY2Nlc3MgZGlnaXRzLCBtYWNyb3MgYXNzdW1lIGxlbmd0aCBnaXZl
biAqLw0KLyo9aGVhZDEgQWNjZXNzIG1hY3Jvcw0KDQo9aGVhZDIgQk5fc2V0
ZChCSUdOVU0qLCBwb3MsIHZhbHVlKQ0KDQpTZXQgZGlnaXQgYXQgcG9zICh6
ZXJvIGlzIGxzZCkgdG8gdmFsdWUNCg0KPWhlYWQyIEJOX2dldGQoQklHTlVN
KiwgcG9zKQ0KDQpHZXQgdmFsdWUgb2YgZGlnaXQgYXQgcG9zLg0KDQo9Y3V0
Ki8NCiNkZWZpbmUgQk5fc2V0ZCh4LCB5LCB6KSBcDQogICAgKCB4LT5idWZm
ZXJbKHkpIC8gQk5fRF9QRVJfTklCXSA9IFwNCiAgICAgKCh6KSA8PCAoICh5
KSAlIEJOX0RfUEVSX05JQikqNCkgfCBcDQogICAgICh4LT5idWZmZXJbKHkp
IC8gQk5fRF9QRVJfTklCXSAmIH4oMTU8PCAoICh5KSAlIEJOX0RfUEVSX05J
QikqNCkpKSANCiNkZWZpbmUgQk5fZ2V0ZCh4LHkpIFwNCiAgICAoICh4LT5i
dWZmZXJbKHkpIC8gQk5fRF9QRVJfTklCXSA+PiBcDQogICAgICggKHkpICUg
Qk5fRF9QRVJfTklCKSo0KSAmIDE1ICkNCg0KI2RlZmluZSBDSEVDS19PVkVS
RkxPVyhleHBuLCBhZGQsIG1heCwgbXNnKSBcDQogICAgaWYgKG1heCAtIGV4
cG4gPCBhZGQpIHsgQk5fRVhDRVBUKFBJTlRfIEJOX09WRVJGTE9XLCBtc2cp
OyB9DQojZGVmaW5lIENIRUNLX1VOREVSRkxPVyhleHBuLCBzdWIsIG1pbiwg
bXNnKSBcDQogICAgaWYgKG1pbiAtIGV4cG4gPiAoLXN1YikpIHsgQk5fRVhD
RVBUKFBJTlRfIEJOX1VOREVSRkxPVywgbXNnKTsgfQ0KDQpjaGFyKiBsYXp5
Z2RicHJpbnQoQklHTlVNKiBmb28pIHsNCiAgY2hhcipzOw0KICBCTl90b19z
Y2llbnRpZmljX3N0cmluZyhmb28sICZzKTsNCiAgcmV0dXJuIHM7DQp9DQoN
Ci8qIEludGVybmFsIGZ1bmN0aW9ucyArIHR5cGVzICovDQp0eXBlZGVmIGVu
dW0gew0KICBCTl9ESVZfRElWSURFLA0KICBCTl9ESVZfRElWSU5ULA0KICBC
Tl9ESVZfUkVNQUlODQp9IEJOX0RJVl9FTlVNOw0Kdm9pZA0KQk5faWRpdmlk
ZSAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklHTlVN
ICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQsDQoJICAgIEJOX0RJVl9FTlVN
IG9wZXJhdGlvbiwgQklHTlVNKiByZW0pOw0KSU5UVkFMIEJOX3RvX3NjaWVu
Z19zdHJpbmcoUElOVERfIEJJR05VTSogYm4sIGNoYXIgKipkZXN0LCBpbnQg
ZW5nKTsNCnZvaWQgQk5fc3RyaXBfbGVhZF96ZXJvcyhQSU5URF8gQklHTlVN
KiB2aWN0aW0pOw0Kdm9pZCBCTl9zdHJpcF90YWlsX3plcm9zKFBJTlREXyBC
SUdOVU0qIHZpY3RpbSk7DQppbnQgQk5fcm91bmRfdXAoUElOVERfIEJJR05V
TSAqdmljdGltLCBCTl9DT05URVhUKiBjb250ZXh0KTsNCmludCBCTl9yb3Vu
ZF9kb3duKFBJTlREXyBCSUdOVU0gKnZpY3RpbSwgQk5fQ09OVEVYVCogY29u
dGV4dCk7DQp2b2lkIEJOX21ha2VfaW50ZWdlcihQSU5URF8gQklHTlVNKiBi
biwgQk5fQ09OVEVYVCogY29udGV4dCk7DQp2b2lkIEJOX3JlYWxseV96ZXJv
KFBJTlREXyBCSUdOVU0qIGJuKTsNCnZvaWQNCkJOX2FyaXRoX3NldHVwKFBJ
TlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdv
LCBCTl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQNCkJOX2FyaXRoX2NsZWFu
dXAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklHTlVN
ICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpOw0Kdm9pZCBCTl9pYWRkKFBJ
TlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdv
LCBCTl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQgQk5faXN1YnRyYWN0KFBJ
TlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdv
LCBCTl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQgQk5fYWxpZ24oUElOVERf
IEJJR05VTSogb25lLCBCSUdOVU0qIHR3byk7DQppbnQgQk5fY29tcCAoUElO
VERfIEJJR05VTSAqb25lLCBCSUdOVU0gKnR3byk7DQoNCi8qPWhlYWQxIE1l
bW9yeSBNYW5hZ2VtZW50IGFuZCBCSUdOVU0gY3JlYXRpb24NCg0KPWN1dCov
DQoNCi8qPWhlYWQyIEJJR05VTSogQk5fbmV3KElOVFZBTCBsZW5ndGgpDQoN
CkNyZWF0ZSBhIG5ldyBCTi4gIGxlbmd0aCBpcyBudW1iZXIgb2YgSTxkZWNp
bWFsPiBkaWdpdHMgcmVxdWlyZWQuDQoNCj1jdXQqLw0KQklHTlVNKiBCTl9u
ZXcoUElOVERfIElOVFZBTCBsZW5ndGgpIHsNCiAgQklHTlVNKiBibjsNCiAg
Ym4gPSAoQklHTlVNKilCTl9hbGxvYyhQSU5UXyBzaXplb2YoQklHTlVNKSk7
DQogIGlmIChOVUxMID09IGJuKQ0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9J
TlNVRkZJQ0lFTlRfU1RPUkFHRSwgIkNhbm5vdCBhbGxvY2F0ZSBuZXcgQmln
TnVtIik7DQogIA0KICBibi0+bmlicyA9IDEgKyBsZW5ndGggLyBCTl9EX1BF
Ul9OSUI7DQogIGJuLT5idWZmZXIgPSAoQk5fTklCKilCTl9hbGxvYyhQSU5U
XyBzaXplb2YoQk5fTklCKSAqIGJuLT5uaWJzKTsNCiAgaWYgKE5VTEwgPT0g
Ym4tPmJ1ZmZlcikNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fSU5TVUZGSUNJ
RU5UX1NUT1JBR0UsICJDYW5ub3QgYWxsb2NhdGUgbmV3IEJpZ051bSIpOw0K
DQogIGJuLT5zaWduID0gMDsNCiAgYm4tPmV4cG4gPSAwOw0KICBibi0+ZGln
aXRzID0gMTsNCg0KICByZXR1cm4gYm47DQp9DQoNCi8qPWhlYWQyIGludCBC
Tl9ncm93KEJJR05VTSAqaW4sIElOVFZBTCBsZW5ndGgpDQoNCkdyb3dzIGlu
IHNvIHRoYXQgaXQgY2FuIGNvbnRhaW4gbGVuZ3RoIEk8ZGVjaW1hbD4gZGln
aXRzLg0KDQo9Y3V0Ki8NCmludCBCTl9ncm93KFBJTlREXyBCSUdOVU0gKmlu
LCBJTlRWQUwgbGVuZ3RoKSB7DQogIGFzc2VydChpbiAhPSBOVUxMKTsNCiAg
aWYgKGxlbmd0aCA8PSBpbi0+bmlicyAqIDgpDQogICAgcmV0dXJuIDA7DQoN
CiAgaWYgKGxlbmd0aCA+IEJOX01BWF9ESUdJVFMpDQogICAgQk5fRVhDRVBU
KFBJTlRfIEJOX09WRVJGTE9XLCAiQXR0ZW1wdCB0byBncm93IEJJR05VTSBi
ZXlvbmQgbGltaXRzIik7DQoNCiAgaW4tPm5pYnMgPSAxKyBsZW5ndGggLyBC
Tl9EX1BFUl9OSUI7DQogIGluLT5idWZmZXIgPSAoQk5fTklCKilCTl9yZWFs
bG9jKFBJTlRfIGluLT5idWZmZXIsIHNpemVvZihCTl9OSUIpKiAoaW4tPm5p
YnMpICk7DQogIGlmIChOVUxMPT1pbi0+YnVmZmVyKQ0KICAgIEJOX0VYQ0VQ
VChQSU5UXyBCTl9JTlNVRkZJQ0lFTlRfU1RPUkFHRSwgIkNhbm5vdCBncm93
IEJJR05VTSIpOw0KICByZXR1cm4gMDsNCn0NCg0KLyo9aGVhZDIgaW50IEJO
X2Rlc3Ryb3koQklHTlVNICpibikNCg0KRnJlZXMgdGhlIG1lbW9yeSB1c2Vk
IGJ5IHRoZSBCSUdOVU0uDQoNCj1jdXQqLw0KaW50IEJOX2Rlc3Ryb3koUElO
VERfIEJJR05VTSAqYm4pIHsNCiAgYXNzZXJ0KGJuIT1OVUxMKTsNCg0KICBC
Tl9mcmVlKFBJTlRfIGJuLT5idWZmZXIpOw0KICBCTl9mcmVlKFBJTlRfIGJu
KTsNCiAgcmV0dXJuIDA7DQp9DQoNCi8qPWhlYWQxIEdldHRpbmcgZGF0YSBp
bnRvIGEgYmlnbnVtDQoNCj1oZWFkMiBCTl9zZXRfZGlnaXQoQklHTlVNKiBi
biwgSU5UVkFMIHBvcywgaW50IHZhbHVlKQ0KDQpTZXRzIGRpZ2l0IGF0IHBv
cyB0byB2YWx1ZS4gIEV4dGVuZHMgaWYgbmVlZGVkLg0KDQo9Y3V0Ki8NCmlu
dCBCTl9zZXRfZGlnaXQoUElOVF8gQklHTlVNKiBibiwgSU5UVkFMIHBvcywg
aW50IHZhbHVlKSB7DQogIGFzc2VydChibiAhPSBOVUxMKTsNCiAgaWYgKHBv
cyA+IGJuLT5uaWJzICogQk5fRF9QRVJfTklCKQ0KICAgIEJOX2dyb3coYm4s
IHBvcyk7DQogIGFzc2VydCh2YWx1ZSA8IDEwKTsNCiAgQk5fc2V0ZChibiwg
cG9zLCB2YWx1ZSk7DQogIGlmIChibi0+ZGlnaXRzIDwgcG9zKzEpDQogICAg
Ym4tPmRpZ2l0cyA9IHBvcysxOw0KICByZXR1cm4gdmFsdWU7DQp9DQoNCi8q
PWhlYWQyIGludCBCTl9nZXRfZGlnaXQoQklHTlVNKiBibiwgSU5UVkFMIHBv
cykNCg0KR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZGVjaW1hbCBkaWdpdCBhdCBw
b3MuDQoNCj1jdXQqLw0KaW50IEJOX2dldF9kaWdpdChQSU5URF8gQklHTlVN
KiBibiwgSU5UVkFMIHBvcykgew0KICBhc3NlcnQoYm4gIT0gTlVMTCk7DQog
IHJldHVybiBCTl9nZXRkKGJuLCBwb3MpOw0KfQ0KDQovKj1oZWFkMiBCSUdO
VU0gKkJOX2NvcHkoQklHTlVNKiBvbmUsIEJJR05VTSogdHdvKQ0KDQpDb3Bp
ZXMgdHdvIGludG8gb25lLCByZXR1cm5pbmcgb25lIGZvciBjb252ZW5pZW5j
ZS4NCg0KPWN1dCovDQpCSUdOVU0qIEJOX2NvcHkoUElOVERfIEJJR05VTSog
b25lLCBCSUdOVU0qIHR3bykgew0KICBhc3NlcnQob25lICE9IE5VTEwpOyBh
c3NlcnQodHdvICE9IE5VTEwpOw0KDQogIEJOX2dyb3coUElOVF8gdHdvLCBv
bmUtPmRpZ2l0cyk7DQogIG1lbWNweSgodm9pZCopb25lLT5idWZmZXIsICh2
b2lkKil0d28tPmJ1ZmZlciwNCgkgKDErdHdvLT5kaWdpdHMgLyBCTl9EX1BF
Ul9OSUIpICogc2l6ZW9mKEJOX05JQikpOw0KICBvbmUtPmRpZ2l0cyA9IHR3
by0+ZGlnaXRzOw0KICBvbmUtPmV4cG4gPSB0d28tPmV4cG47DQogIG9uZS0+
c2lnbiA9IHR3by0+c2lnbjsNCiAgcmV0dXJuIG9uZTsNCn0NCg0KLyo9aGVh
ZDIgQklHTlVNKiBCTl9uZXdfZnJvbV9pbnQoSU5UVkFMIHZhbHVlKQ0KDQpD
cmVhdGUgYSBuZXcgYmlnbnVtIGZyb20gYSAoc2lnbmVkKSBpbnRlZ2VyIHZh
bHVlIChJTlRWQUwpDQpXZSBhc3N1bWUgdGhhdCB0aGUgaW1wbGVtZW50YXRp
b24gbGltaXRzIGFyZSBzb21ld2hhdCBsYXJnZXIgdGhhbg0KdGhvc2UgcmVx
dWlyZWQgdG8gc3RvcmUgYSBzaW5nbGUgaW50ZWdlciBpbnRvIGEgYmlnbnVt
Lg0KDQo9Y3V0Ki8NCkJJR05VTSogQk5fbmV3X2Zyb21faW50KFBJTlREXyBJ
TlRWQUwgdmFsdWUpIHsNCiAgQklHTlVNICpuZXc7DQogIGludCBpLCBjdXJy
ZW50Ow0KICBuZXcgPSBCTl9uZXcoUElOVF8gQk5fRF9QRVJfSU5UKTsNCiAg
aWYgKHZhbHVlIDwgMCkgew0KICAgIG5ldy0+c2lnbiA9IDE7DQogICAgdmFs
dWUgPSAtdmFsdWU7DQogIH0NCiAgaSA9IDA7DQogIHdoaWxlICh2YWx1ZSkg
ew0KICAgIGN1cnJlbnQgPSB2YWx1ZSAlIDEwOw0KICAgIEJOX3NldGQobmV3
LCBpLCBjdXJyZW50KTsNCiAgICB2YWx1ZSA9IHZhbHVlIC8gMTA7DQogICAg
aSsrOw0KICB9DQogIG5ldy0+ZGlnaXRzID0gaTsgLyogQXMgQk5fbmV3IHJl
dHVybnMgYDAnLCB3aGljaCBoYXMgb25lIGRpZ2l0ICovDQogIG5ldy0+ZXhw
biA9IDA7DQogIHJldHVybiBuZXc7DQp9DQoNCi8qPWhlYWQyIEJOX1BSSU5U
X0RFQlVHDQoNCkR1bXAgdGhlIGJpZ251bSBmb3IgdGVzdGluZyAoc2hvdWxk
IHRoZSB0b18qX3N0cmluZyB2ZXJzaW9ucyBiZSBicm9rZWQpLg0KDQo9Y3V0
Ki8NCnZvaWQgQk5fUFJJTlRfREVCVUcgKEJJR05VTSAqYm4sIGNoYXIqIG1l
c2cpIHsNCiAgSU5UVkFMIGk7DQogIHByaW50ZigiJXM6IG5pYnMgJWkgZGln
aXRzICVpIHNpZ24gJWkgZXhwbiAlaSBcbiIsbWVzZywNCgkgYm4tPm5pYnMs
IGJuLT5kaWdpdHMsIGJuLT5zaWduLCBibi0+ZXhwbik7DQogIGZvciAoaT1i
bi0+ZGlnaXRzLTE7IGk+LTE7IGktLSkgew0KICAgIHByaW50ZigiJWQiLCBC
Tl9nZXRkKGJuLCBpKSk7DQogICAgaWYgKCEoaSU0KSkgcHJpbnRmKCIgIik7
DQogIH0NCiAgcHJpbnRmKCJcbiIpOw0KfQ0KDQovKj1oZWFkMiB2b2lkIEJO
X2V4Y2VwdGlvbihCTl9FWENFUFRJT05TIGV4Y2VwdGlvbikNCg0KVGhyb3cg
YGV4Y2VwdGlvbicuICBTaG91bGQgYmUgYWNjZXNzZWQgdmlhIGEgQk5fRVhD
RVBUIG1hY3JvDQoNCj1jdXQgKi8NCnZvaWQgQk5fZXhjZXB0aW9uKFBJTlRE
XyBCTl9FWENFUFRJT05TIGV4Y2VwdGlvbiwgY2hhciogbWVzc2FnZSkgew0K
ICBwcmludGYoIkV4Y2VwdGlvbiAlZCAlc1xuIiwgZXhjZXB0aW9uLCBtZXNz
YWdlKTsNCiAgYWJvcnQoKTsNCiAgZXhpdCgwKTsNCn0NCg0KLyo9aGVhZDEg
Q29udmVyc2lvbiB0byBhbmQgZnJvbSBzdHJpbmdzDQoNCj1oZWFkMiBJTlRW
QUwgQk5fdG9fc2NpZW50aWZpY19zdHJpbmcoQklHTlVNKiBibiwgY2hhciog
ZGVzdCkNCg0KQ29udmVydHMgYm4gaW50byBhIHNjaWVudGlmaWMgcmVwcmVz
ZW50YXRpb24sIHN0b3JlZCBpbiBkZXN0Lg0KDQo9aGVhZDIgSU5UVkFMIEJO
X3RvX2VuZ2luZWVyaW5nX3N0cmluZyhCSUdOVU0qIGJuLCBjaGFyKiBkZXN0
KQ0KDQpDb252ZXJ0cyBibiBpbnRvIGEgZW5naW5lZXJpbmcgcmVwcmVzZW50
YXRpb24sIHN0b3JlZCBpbiBkZXN0Lg0KDQpUaGVzZSBmdW5jdGlvbnMgcmV0
dXJuIGNoYXIqIHN0cmluZ3Mgb25seSwgcGFycm90IG1heSB3YW50IHRvDQpy
ZWltcGxlbWVudCB0aGVzZSBzbyB0aGF0IGxvY2FscyBhbmQgdGhlIGxpa2Ug
YXJlIG5pY2VseSBjb3BlZCB3aXRoLg0KDQo9Y3V0Ki8NCg0KSU5UVkFMIEJO
X3RvX3NjaWVudGlmaWNfc3RyaW5nKFBJTlREXyBCSUdOVU0qYm4sIGNoYXIg
KipkZXN0KSB7DQogIEJOX3RvX3NjaWVuZ19zdHJpbmcoUElOVF8gYm4sIGRl
c3QsIDApOw0KfQ0KSU5UVkFMIEJOX3RvX2VuZ2luZWVyaW5nX3N0cmluZyhQ
SU5URF8gQklHTlVNKmJuLCBjaGFyICoqZGVzdCkgew0KICBCTl90b19zY2ll
bmdfc3RyaW5nKFBJTlRfIGJuLCBkZXN0LCAxKTsNCn0NCg0KSU5UVkFMIEJO
X3RvX3NjaWVuZ19zdHJpbmcoUElOVERfIEJJR05VTSogYm4sIGNoYXIgKipk
ZXN0LCBpbnQgZW5nKSB7DQogIGNoYXIqIGN1cjsNCiAgSU5UVkFMIGFkal9l
eHAgPSAwOw0KICBJTlRWQUwgY3VyX2RpZyA9IDA7DQogIGFzc2VydChibiE9
TlVMTCk7DQogICpkZXN0ID0gKGNoYXIqKUJOX2FsbG9jKFBJTlRfIGJuLT5k
aWdpdHMgKyA1ICsgQk5fRF9QRVJfSU5UKTsNCiAgaWYgKGRlc3QgPT0gTlVM
TCkgew0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9JTlNVRkZJQ0lFTlRfU1RP
UkFHRSwNCgkgICAgICAiQ2Fubm90IGNyZWF0ZSBidWZmZXIgdG8gaG9sZCBv
dXRwdXQgc3RyaW5nIik7DQogIH0NCg0KICBjdXIgPSAqZGVzdDsNCg0KICBh
ZGpfZXhwID0gYm4tPmRpZ2l0cyArIGJuLT5leHBuIC0xOw0KICAgLyogRm9y
IHZhbHVlcyBuZWFyIHRvIHplcm8sIHdlIGRvIG5vdCB1c2UgZXhwb25lbnRp
YWwgbm90YXRpb24gKi8NCiAgaWYgKGJuLT5leHBuIDw9IDAgJiYgYWRqX2V4
cCA+PSAtNikgew0KICAgIGlmIChibi0+c2lnbikgew0KICAgICAgKmN1cisr
ID0gJy0nOw0KICAgIH0NCiAgICAvKnBhZCB3aXRoIHplcm9zIGlmIGFwcHJv
cHJpYXRlLCBwbG9uayBhIHBvaW50IHdoZXJlIHdlIHdhbnQgaXQgKi8NCiAg
ICBpZiAoYm4tPmRpZ2l0cyArIGJuLT5leHBuIDw9IDApIHsNCiAgICAgIGlu
dCBpOw0KICAgICAgKmN1cisrID0gJzAnOw0KICAgICAgaWYgKGJuLT5kaWdp
dHMrYm4tPmV4cG48MCkgKmN1cisrID0gJy4nOyAvKlhYWDogbG9jYWxlcyAq
Lw0KICAgICAgZm9yIChpPTE7IGkgPCAtKGJuLT5kaWdpdHMgKyBibi0+ZXhw
bik7IGkrKykgKmN1cisrID0gJzAnOw0KICAgIH0NCiAgICBmb3IgKGN1cl9k
aWcgPSBibi0+ZGlnaXRzLTE7IGN1cl9kaWcgPi0xOyBjdXJfZGlnLS0pIHsN
CiAgICAgIGlmICgxK2N1cl9kaWcgKyBibi0+ZXhwbiA9PSAwKSAqY3VyKysg
PScuJzsNCiAgICAgICpjdXIrKyA9ICcwJyArIEJOX2dldGQoYm4sIGN1cl9k
aWcpOw0KICAgIH0NCiAgICAqY3VyID0gMDsNCiAgfQ0KICBlbHNlIHsgLyog
VXNlIGV4cG9uZW50aWFsIG5vdGF0aW9uLCBkaWZmZXJlbnQgZm9yIHNjaSBh
bmQgZW5nICovDQogICAgaWYgKGJuLT5zaWduKSAqY3VyKysgPSAnLSc7DQog
ICAgDQogICAgaWYgKGVuZykgew0KICAgICAgaW50IGRlZmljaXQ7DQogICAg
ICBpZiAoYWRqX2V4cCA8IDApIHsNCglkZWZpY2l0ID0gKC1hZGpfZXhwKSAl
IDM7DQoJaWYgKGRlZmljaXQgPT0gMSkgew0KCSAgZGVmaWNpdCA9IDI7DQoJ
ICBhZGpfZXhwIC09IDI7IA0KCX0NCgllbHNlIGlmIChkZWZpY2l0ID09IDIp
IHsNCgkgIGRlZmljaXQgPSAxOw0KCSAgYWRqX2V4cCAtPTE7DQoJfQ0KICAg
ICAgfQ0KICAgICAgZWxzZSB7DQoJZGVmaWNpdCA9IGFkal9leHAgJSAzOw0K
CWFkal9leHAgLT0gZGVmaWNpdDsNCiAgICAgIH0NCiAgICAgIC8qIHNvLCBk
ID0gMC4geC55eXl5LCBkPTEgeHgueSBkPTIgeHh4Lnl5eSBzcGVjaWFsIGNh
c2UgaWYgeHh4Ki8NCg0KICAgICAgKmN1cisrID0gJzAnICsgQk5fZ2V0ZChi
bixibi0+ZGlnaXRzLTEpOw0KICAgICAgaWYgKGRlZmljaXQgPT0gMCkgKmN1
cisrID0gJy4nOw0KDQogICAgICBpZiAoYm4tPmRpZ2l0cyA9PSAxKSB7DQoJ
KmN1cisrID0gJzAnOw0KCWlmIChkZWZpY2l0ID09IDEpICpjdXIrKyA9ICcu
JzsNCgkqY3VyKysgPSAnMCc7DQogICAgICB9DQogICAgICBlbHNlIGlmIChi
bi0+ZGlnaXRzID09IDIpIHsNCgkqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJu
LGJuLT5kaWdpdHMtMik7DQoJaWYgKGRlZmljaXQgPT0gMSkgKmN1cisrID0g
Jy4nOw0KCSpjdXIrKyA9ICcwJzsgDQogICAgICB9DQogICAgICBlbHNlIHsN
CgkqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLGJuLT5kaWdpdHMtMik7DQoJ
aWYgKGRlZmljaXQgPT0gMSkgKmN1cisrID0gJy4nOw0KCSpjdXIrKyA9ICcw
JyArIEJOX2dldGQoYm4sYm4tPmRpZ2l0cy0zKTsNCglpZiAoYm4tPmRpZ2l0
cyAhPSAzICYmIGRlZmljaXQgPT0gMikgKmN1cisrID0gJy4nOw0KDQoJZm9y
IChjdXJfZGlnPWJuLT5kaWdpdHMtNDsgY3VyX2RpZz4tMTsgY3VyX2RpZy0t
KSB7DQoJICAqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLCBjdXJfZGlnKTsN
Cgl9DQogICAgICB9DQoNCiAgICAgICpjdXIrKyA9ICdFJzsNCiAgICAgIHNw
cmludGYoY3VyLCAiJWkiLCBhZGpfZXhwKTsNCg0KICAgIH0NCiAgICBlbHNl
IHsgLyogU2NpZW50aWZpYyAqLw0KICAgICAgaWYgKGJuLT5kaWdpdHMgPT0g
MSkgew0KCSpjdXIrKyA9ICcwJysgQk5fZ2V0ZChibiwgMCk7DQogICAgICB9
DQogICAgICBlbHNlIHsNCgkqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLCBi
bi0+ZGlnaXRzLTEpOw0KCSpjdXIrKyA9ICcuJzsNCglmb3IgKGN1cl9kaWcg
PSBibi0+ZGlnaXRzLTI7IGN1cl9kaWcgPiAtMTsgY3VyX2RpZy0tKSB7DQoJ
ICAqY3VyKysgPSAnMCcgKyBCTl9nZXRkKGJuLCBjdXJfZGlnKTsNCgl9DQog
ICAgICB9DQogICAgICAqY3VyKysgPSAnRSc7IC8qIEV6YSBHb29kLCBFemEg
R29vZCAqLw0KICAgICAgc3ByaW50ZihjdXIsICIlaSIsIGFkal9leHApOyAg
ICAgIA0KICAgIH0NCiAgfQ0KDQogIHJldHVybiAwOw0KfQ0KDQovKj1oZWFk
MiBCSUdOVU0qIEJOX2Zyb21fc3RyaW5nKGNoYXIqIHN0cmluZykgDQoNCkNv
bnZlcnQgYSBzY2llbnRpZmljIHN0cmluZyB0byBhIEJJR05VTS4gIFRoaXMg
ZnVuY3Rpb24gZGVhbHMgZW50aXJlbHkNCndpdGggY29tbW9uLW9yLWdhcmRl
biBDIGJ5dGUgc3RyaW5ncywgc28gdGhlIGxpYnJhcnkgY2FuIHdvcmsNCmFu
eXdoZXJlLiAgQW5vdGhlciB2ZXJzaW9uIHdpbGwgYmUgZXZlbnR1YWxseSBy
ZXF1aXJlZCB0byBjb3BlIHdpdGgNCnRoZSBwYXJyb3Qgc3RyaW5nIGZ1bi4N
Cg0KVGhpcyBpcyB0aGUgSGlnaGx5IFBlZGFudGljIHN0cmluZyBjb252ZXJz
aW9uLg0KDQpEb2VzIG5vdCB5ZXQgY2hlY2sgZm9yIGV4cG9uZW50IG92ZXJm
bG93Lg0KDQo9Y3V0Ki8NCkJJR05VTSogQk5fZnJvbV9zdHJpbmcoUElOVERf
IGNoYXIqIHMyKSB7DQogIEJJR05VTSAqcmVzdWx0Ow0KICBCSUdOVU0gKnRl
bXA7DQoNCiAgSU5UVkFMIHBvcyA9IDA7DQogIElOVFZBTCBuZWdhdGl2ZSA9
IDA7DQogIElOVFZBTCBzZWVuX2RvdCA9IDA7DQogIElOVFZBTCBzZWVuX2Ug
PSAwOw0KICBJTlRWQUwgZXhwX3NpZ24gPSAwOw0KICBJTlRWQUwgaW5fZXhw
ID0gMDsNCiAgSU5UVkFMIGluX251bWJlciA9IDA7DQogIElOVFZBTCBleHBv
bmVudCA9IDA7DQogIElOVFZBTCBmYWtlX2V4cG9uZW50ID0gMDsNCiAgSU5U
VkFMIGkgPSAwOw0KDQogIHRlbXAgPSBCTl9uZXcoUElOVF8gMSk7DQogIA0K
ICB3aGlsZSAoczIpIHsgLyogY2hhcmdlIHRocm91Z2ggdGhlIHN0cmluZyAq
Lw0KICAgIGlmIChpc2RpZ2l0KCpzMikgJiYgIWluX2V4cCkgew0KICAgICAg
LyogV2UncmUgc29tZXdoZXJlIGluIHRoZSBtYWluIHN0cmluZyBvZiBudW1i
ZXJzICovDQogICAgICBpbl9udW1iZXIgPSAxOw0KICAgICAgQk5fZ3JvdyhQ
SU5UXyB0ZW1wLCBwb3MrMTApOw0KICAgICAgQk5fc2V0ZCh0ZW1wLCBwb3Ms
ICpzMiAtICcwJyk7IC8qIGJ5dGUgbWUhICovDQogICAgICBpZiAoc2Vlbl9k
b3QpIHsNCglmYWtlX2V4cG9uZW50LS07DQogICAgICB9DQogICAgfQ0KICAg
IGVsc2UgaWYgKGlzZGlnaXQoKnMyKSAmJiBpbl9leHApIHsNCiAgICAgIGV4
cG9uZW50ID0gMTAgKiBleHBvbmVudCArICgqczIgLSAnMCcpOyAvKlhYWDog
b3ZlcmZsb3cgY2hlY2sgKi8NCiAgICB9DQogICAgZWxzZSBpZiAoIWluX251
bWJlcikgew0KICAgICAgLyogd2UndmUgbm90IHlldCBzZWVuIGFueSBkaWdp
dHMgKi8NCiAgICAgIGlmICgqczIgPT0gJy0nKSB7DQoJbmVnYXRpdmUgPSAx
Ow0KICAgICAgfQ0KICAgICAgZWxzZSBpZiAoKnMyID09ICcuJykgew0KCXNl
ZW5fZG90ID0gMTsNCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KCUJOX0VYQ0VQ
VChQSU5UXyBCTl9DT05WRVJTSU9OX1NZTlRBWCwgIkluY29ycmVjdCBudW1i
ZXIgZm9ybWF0Iik7DQogICAgICB9DQogICAgfQ0KICAgIGVsc2Ugew0KICAg
ICAgLyogd2UndmUgc2VlbiBzb21lIGRpZ2l0cywgYXJlIHdlIGRvbmUgeWV0
PyAqLw0KICAgICAgaWYgKCFzZWVuX2RvdCAmJiAqczIgPT0gJy4nICYmICFp
bl9leHApIHsNCglzZWVuX2RvdCA9IDE7DQogICAgICB9DQogICAgICBlbHNl
IGlmICghc2Vlbl9lICYmICgqczIgPT0gJ2UnIHx8ICpzMiA9PSAnRScpKSB7
DQoJc2Vlbl9lID0gMTsNCglpbl9leHAgPSAxOw0KICAgICAgfQ0KICAgICAg
ZWxzZSBpZiAoc2Vlbl9lICYmICFleHBfc2lnbikgew0KCWlmICgqczIgPT0g
JysnKSB7DQoJICBleHBfc2lnbiA9IDE7DQoJfQ0KCWVsc2UgaWYgKCpzMiA9
PSAnLScpIHsNCgkgIGV4cF9zaWduID0gLTE7DQoJfQ0KCWVsc2Ugew0KCSAg
Qk5fRVhDRVBUKFBJTlRfIEJOX0NPTlZFUlNJT05fU1lOVEFYLCAiSW5jb3Jy
ZWN0IG51bWJlciBmb3JtYXQiKTsNCgl9DQogICAgICB9DQogICAgICBlbHNl
IHsNCglCTl9FWENFUFQoUElOVF8gQk5fQ09OVkVSU0lPTl9TWU5UQVgsICJJ
bmNvcnJlY3QgbnVtYmVyIGZvcm1hdCIpOw0KICAgICAgfQ0KICAgIH0NCiAg
ICBzMisrOyAvKiByaW5zZSwgbGF0aGVyLi4uICovDQogIH0NCiAgaWYgKHBv
cz09MCkgew0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9DT05WRVJTSU9OX1NZ
TlRBWCwgIm5vIGRpZ2l0cyBpbiBzdHJpbmciKTsNCiAgfQ0KDQoNCiAgdGVt
cC0+ZGlnaXRzID0gcG9zKzE7DQogIHJlc3VsdCA9IEJOX25ldyhwb3MrMSk7
DQoNCiAgZm9yIChpPTA7IGk8IHRlbXAtPmRpZ2l0czsgaSsrKSB7DQogICAg
Qk5fc2V0ZChyZXN1bHQsIGksIEJOX2dldGQodGVtcCwgdGVtcC0+ZGlnaXRz
LWktMSkpOw0KICB9DQogIA0KICByZXN1bHQtPnNpZ24gPSBuZWdhdGl2ZTsN
CiAgcmVzdWx0LT5kaWdpdHMgPSBwb3MrMTsNCg0KICBCTl9kZXN0cm95KFBJ
TlRfIHRlbXApOw0KDQogIGlmIChleHBfc2lnbiA9PSAtMSkgew0KICAgIHJl
c3VsdC0+ZXhwbiA9IGZha2VfZXhwb25lbnQgLSBleHBvbmVudDsNCiAgfQ0K
ICBlbHNlIHsNCiAgICByZXN1bHQtPmV4cG4gPSBmYWtlX2V4cG9uZW50ICsg
ZXhwb25lbnQ7DQogIH0NCg0KICByZXR1cm4gcmVzdWx0Ow0KfQ0KDQoNCi8q
PWhlYWQxIEFyaXRobWV0aWMgT3BlcmF0aW9ucw0KDQpUaGVzZSBkbyB3aGF0
IHRoZXkgc2F5IG9uIHRoZSB0aW4sIGlmIG5vIHByZWNpc2lvbiBpcyBzdXBw
bGllZCB0aGVuDQpzb21lIGFwcHJvcHJpYXRlIGdsb2JhbCB2ZXJzaW9uIGlz
IHVzZWQgaW5zdGVhZC4NCg0KPWhlYWQyIEhlbHBlciByb3V0aW5lcw0KDQo9
b3ZlciA0DQoNCj1pdGVtIEJOX3N0cmlwX3plcm9zKEJJR05VTSogdmljdGlt
KQ0KDQpSZW1vdmVzIGFueSB6ZXJvcyBiZWZvcmUgdGhlIG1zZCBhbmQgYWZ0
ZXIgdGhlIGxzZA0KDQo9Y3V0Ki8NCnZvaWQgQk5fc3RyaXBfbGVhZF96ZXJv
cyhQSU5URF8gQklHTlVNKiBibikgew0KICBJTlRWQUwgbXNkLCBpOw0KICAN
CiAgbXNkID0gYm4tPmRpZ2l0cy0xOw0KDQogIHdoaWxlICgwPT1CTl9nZXRk
KGJuLCBtc2QpICYmIG1zZCA+IDApIHsNCiAgICBtc2QtLTsNCiAgfQ0KDQog
IGJuLT5kaWdpdHMgLT0gYm4tPmRpZ2l0cy0xIC0gbXNkOw0KDQp9DQoNCi8q
PWl0ZW0gQk5fc3RyaXBfdGFpbF96ZXJvcyhCSUdOVU0gKnZpY3RpbSkNCg0K
UmVtb3ZlcyB0cmFpbGluZyB6ZXJvcyBhbmQgaW5jcmVhc2VzIHRoZSBleHBv
bmVudCBhcHByb3ByaWF0ZWx5Lg0KDQo9Y3V0Ki8NCg0Kdm9pZCBCTl9zdHJp
cF90YWlsX3plcm9zKFBJTlREXyBCSUdOVU0gKmJuKSB7DQogIElOVFZBTCBs
c2QsIGk7DQoNCiAgbHNkID0gMDsNCg0KICB3aGlsZSAoMD09Qk5fZ2V0ZChi
biwgbHNkKSkgew0KICAgIGxzZCsrOw0KICB9DQoNCiAgZm9yIChpPTA7IGk8
IGJuLT5kaWdpdHMgLWxzZDsgaSsrKSB7DQogICAgQk5fc2V0ZChibiwgaSwg
Qk5fZ2V0ZChibiwgaStsc2QpKTsNCiAgfQ0KICBDSEVDS19PVkVSRkxPVygg
Ym4tPmV4cG4sIGxzZCwgQk5fRVhQTl9NQVgsICJvdmVyZmxvdyB3aGVuIHN0
cmlwaW5nIHplcm9zIik7DQogIGJuLT5leHBuICs9IGxzZDsNCiAgYm4tPmRp
Z2l0cyAtPSBsc2Q7DQp9DQoNCi8qPWl0ZW0gQk5fbWFrZV9pbnRlZ2VyKEJJ
R05VTSogdmljdGltLCBCTl9DT05URVhUKiBjb250ZXh0KQ0KDQpDb252ZXJ0
IHRoZSBudW1iZXIgdG8gYSBwbGFpbiBpbnRlZ2VyICppZiogcHJlY2lzaW9u
IHN1Y2ggdGhhdCB0aGlzDQppcyBwb3NzaWJsZS4NCg0KPWN1dCovDQp2b2lk
IEJOX21ha2VfaW50ZWdlcihQSU5URF8gQklHTlVNKiBibiwgQk5fQ09OVEVY
VCogY29udGV4dCkgew0KICBpZiAoYm4tPmV4cG4gPiAwICYmIGJuLT5kaWdp
dHMgKyBibi0+ZXhwbiA8PSBjb250ZXh0LT5wcmVjaXNpb24pIHsNCiAgICBJ
TlRWQUwgaTsNCiAgICBCTl9ncm93KFBJTlRfIGJuLCBjb250ZXh0LT5wcmVj
aXNpb24pOw0KICAgIGZvciAoaT1ibi0+ZGlnaXRzLTE7IGk+PSAwOyBpLS0p
IHsNCiAgICAgIEJOX3NldGQoYm4sIGkrYm4tPmV4cG4sIEJOX2dldGQoYm4s
IGkpKTsNCiAgICB9DQogICAgZm9yIChpPTA7IGk8Ym4tPmV4cG47IGkrKykg
ew0KICAgICAgQk5fc2V0ZChibiwgaSwgMCk7DQogICAgfQ0KICAgIGJuLT5k
aWdpdHMgKz0gYm4tPmV4cG47DQogICAgYm4tPmV4cG4gPSAwOw0KICB9DQog
IGVsc2Ugew0KICAgIHJldHVybjsNCiAgfQ0KfQ0KDQovKj1pdGVtIEJOX3Jl
YWxseV96ZXJvKEJJR05VTSogdmljdGltKQ0KDQpTZXRzIGFueSBudW1iZXIg
d2hpY2ggc2hvdWxkIGJlIHplcm8gdG8gYSBjYW5ub25pY2FsIHplcm8uDQoN
Cj1jdXQqLw0Kdm9pZCBCTl9yZWFsbHlfemVybyhQSU5URF8gQklHTlVNKiBi
bikgew0KICBJTlRWQUwgaTsNCiAgZm9yIChpPTA7IGk8IGJuLT5kaWdpdHM7
IGkrKykNCiAgICBpZiAoQk5fZ2V0ZChibiwgaSkgIT0gMCkgcmV0dXJuOw0K
ICANCiAgYm4tPmRpZ2l0cyA9IDE7DQogIGJuLT5leHBuID0gMDsNCiAgYm4t
PnNpZ24gPSAwOw0KICByZXR1cm47DQp9DQoNCi8qPWl0ZW0gQk5fcm91bmQo
QklHTlVNICp2aWN0aW0sIEJOX0NPTlRFWFQqIGNvbnRleHQpDQoNClJvdW5k
cyB2aWN0aW0gYWNjb3JkaW5nIHRvIGNvbnRleHQ7DQoNCj1jdXQqLw0KDQpp
bnQgQk5fcm91bmQgKFBJTlREXyBCSUdOVU0gKmJuLCBCTl9DT05URVhUKiBj
b250ZXh0KSB7DQogIGFzc2VydChibiE9IE5VTEwpOw0KICBhc3NlcnQoY29u
dGV4dCAhPSBOVUxMKTsNCg0KICBCTl9zdHJpcF9sZWFkX3plcm9zKFBJTlRf
IGJuKTsNCiAgaWYgKGNvbnRleHQtPnByZWNpc2lvbiA8IDApIHJldHVybiAx
OyAvKiBBcyBpcyBhIGJpZ2ludCwgbm8gcm91bmRpbmcgKi8NCg0KICBpZiAo
Ym4tPmRpZ2l0cyA+IGNvbnRleHQtPnByZWNpc2lvbikgew0KICAgIGlmIChj
b250ZXh0LT5sb3N0X2RpZ2l0cykgew0KICAgICAgSU5UVkFMIGRpZ2l0Ow0K
ICAgICAgZm9yIChkaWdpdCA9IDA7IGRpZ2l0IDwgYm4tPmRpZ2l0cyAtIGNv
bnRleHQtPnByZWNpc2lvbjsgZGlnaXQrKykgew0KCWlmIChCTl9nZXRkKGJu
LCBkaWdpdCkgIT0gMCkNCgkgIEJOX0VYQ0VQVChQSU5UXyBCTl9MT1NUX0RJ
R0lUUywgImluZm9ybWF0aW9uIGxvc3Qgd2hpbGUgcm91bmRpbmciICk7DQog
ICAgICB9DQogICAgfQ0KDQogICAgaWYgKGNvbnRleHQtPnJvdW5kaW5nID09
IFJPVU5EX0RPV04pIHsNCiAgICAgIHJldHVybiBCTl9yb3VuZF9kb3duKFBJ
TlRfIGJuLCBjb250ZXh0KTsNCiAgICB9DQogICAgZWxzZSBpZiAoY29udGV4
dC0+cm91bmRpbmcgPT0gUk9VTkRfSEFMRl9VUCkgew0KICAgICAgaWYgKEJO
X2dldGQoYm4sIGJuLT5kaWdpdHMgLSBjb250ZXh0LT5wcmVjaXNpb24gLTEp
ID4gNCkgew0KCXJldHVybiBCTl9yb3VuZF91cChQSU5UXyBibiwgY29udGV4
dCk7DQogICAgICB9DQogICAgICBlbHNlIHsNCglyZXR1cm4gQk5fcm91bmRf
ZG93bihQSU5UXyBibiwgY29udGV4dCk7DQogICAgICB9DQogICAgfQ0KICAg
IGVsc2UgaWYgKGNvbnRleHQtPnJvdW5kaW5nID09IFJPVU5EX0hBTEZfRVZF
Tikgew0KDQogICAgICBpZiAoQk5fZ2V0ZChibiwgYm4tPmRpZ2l0cyAtIGNv
bnRleHQtPnByZWNpc2lvbiAtMSkgPiA1KSB7DQoJcmV0dXJuIEJOX3JvdW5k
X3VwKFBJTlRfIGJuLCBjb250ZXh0KTsNCiAgICAgIH0NCiAgICAgIGVsc2Ug
aWYgKEJOX2dldGQoYm4sIGJuLT5kaWdpdHMgLSBjb250ZXh0LT5wcmVjaXNp
b24gLTEpIDwgNSkgew0KCXJldHVybiBCTl9yb3VuZF9kb3duKFBJTlRfIGJu
LCBjb250ZXh0KTsNCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KCUlOVFZBTCBp
ID0gYm4tPmRpZ2l0cyAtIGNvbnRleHQtPnByZWNpc2lvbiAtMjsNCglpZiAo
aSA8IDApIHJldHVybiBCTl9yb3VuZF91cChQSU5UXyBibiwgY29udGV4dCk7
DQoJd2hpbGUgKGk+PTApIHsNCgkgIGlmIChCTl9nZXRkKGJuLCBpKSAhPSAw
KSByZXR1cm4gQk5fcm91bmRfdXAoUElOVF8gYm4sIGNvbnRleHQpOw0KCSAg
aS0tOw0KCX0NCglzd2l0Y2goQk5fZ2V0ZChibiwgYm4tPmRpZ2l0cy1jb250
ZXh0LT5wcmVjaXNpb24pKSB7DQoJY2FzZSAwIDoNCgljYXNlIDIgOg0KCWNh
c2UgNCA6DQoJY2FzZSA2IDoNCgljYXNlIDggOg0KCSAgcmV0dXJuIEJOX3Jv
dW5kX2Rvd24oUElOVF8gYm4sIGNvbnRleHQpOw0KCWRlZmF1bHQ6DQoJICBy
ZXR1cm4gQk5fcm91bmRfdXAoUElOVF8gYm4sIGNvbnRleHQpOw0KCX0NCiAg
ICAgIH0NCg0KICAgIH0NCiAgICBCTl9FWENFUFQoUElOVF8gQk5fSU5WQUxJ
RF9PUEVSQVRJT04sICJVbmtub3duIHJvdW5kaW5nIGF0dGVtcHRlZCIpOw0K
ICB9DQogIHJldHVybjsNCn0NCg0KaW50IEJOX3JvdW5kX3VwKFBJTlREXyBC
SUdOVU0gKmJuLCBCTl9DT05URVhUKiBjb250ZXh0KSB7DQogIElOVFZBTCBp
LCBjYXJyeTsNCg0KICBjYXJyeSA9IDE7DQogIGZvciAoaSA9IGJuLT5kaWdp
dHMgLSBjb250ZXh0LT5wcmVjaXNpb247IGk8IGJuLT5kaWdpdHM7IGkrKykg
ew0KICAgIGNhcnJ5ICs9IEJOX2dldGQoYm4sIGkpOw0KICAgIEJOX3NldGQo
Ym4sIGktYm4tPmRpZ2l0cyArIGNvbnRleHQtPnByZWNpc2lvbiwgY2Fycnkl
MTApOw0KICAgIGNhcnJ5ID0gY2FycnkgLyAxMDsNCiAgfQ0KICBpZiAoY2Fy
cnkpIHsNCiAgICBJTlRWQUwgZXh0cmEgPSBibi0+ZGlnaXRzIC0gY29udGV4
dC0+cHJlY2lzaW9uOw0KICAgIEJOX3NldGQoYm4sIGNvbnRleHQtPnByZWNp
c2lvbiwgY2FycnkpOw0KICAgIENIRUNLX09WRVJGTE9XKGJuLT5leHBuLCBl
eHRyYSwgQk5fRVhQTl9NQVgsDQoJCSAgICJvdmVyZmxvdyB3aGlsZSByb3Vu
ZGluZyIpOw0KICAgIGJuLT5leHBuICs9IGV4dHJhOw0KICAgIGJuLT5kaWdp
dHMgPSBjb250ZXh0LT5wcmVjaXNpb24gKzE7DQogICAgcmV0dXJuIEJOX3Jv
dW5kKFBJTlRfIGJuLCBjb250ZXh0KTsNCiAgfQ0KICBlbHNlIHsNCiAgICBJ
TlRWQUwgZXh0cmEgPSBibi0+ZGlnaXRzIC0gY29udGV4dC0+cHJlY2lzaW9u
Ow0KICAgIENIRUNLX09WRVJGTE9XKGJuLT5leHBuLCBleHRyYSwgQk5fRVhQ
Tl9NQVgsDQoJCSAgICJvdmVyZmxvdyB3aGlsZSByb3VuZGluZyIpOw0KICAg
IGJuLT5leHBuICs9IGV4dHJhOw0KICAgIGJuLT5kaWdpdHMgPSBjb250ZXh0
LT5wcmVjaXNpb247DQogICAgcmV0dXJuOw0KICB9DQp9DQoNCmludCBCTl9y
b3VuZF9kb3duKFBJTlRfIEJJR05VTSAqYm4sIEJOX0NPTlRFWFQqIGNvbnRl
eHQpIHsNCiAgSU5UVkFMIGkgPTA7DQogIElOVFZBTCBleHRyYTsNCg0KICBm
b3IgKGk9MDsgaTxjb250ZXh0LT5wcmVjaXNpb247IGkrKykgew0KICAgIGlu
dCB0ZW1wID0gQk5fZ2V0ZChibiwgaStibi0+ZGlnaXRzIC0gY29udGV4dC0+
cHJlY2lzaW9uKTsNCiAgICBCTl9zZXRkKGJuLCBpLCB0ZW1wKTsNCiAgfQ0K
ICBleHRyYSA9IGJuLT5kaWdpdHMgLSBjb250ZXh0LT5wcmVjaXNpb247DQog
IENIRUNLX09WRVJGTE9XKGJuLT5leHBuLCBleHRyYSwgQk5fRVhQTl9NQVgs
DQoJCSAib3ZlcmZsb3cgd2hpbGUgcm91bmRpbmciKTsNCiAgYm4tPmV4cG4g
Kz0gZXh0cmE7DQogIGJuLT5kaWdpdHMgPSBjb250ZXh0LT5wcmVjaXNpb247
DQoNCiAgcmV0dXJuOw0KfQ0KDQovKj1iYWNrKi8NCg0KLyo9aGVhZDEgQXJp
dGhtZXRpYyBvcGVyYXRpb25zIA0KDQpPcGVyYXRpb25zIGFyZSBwZXJmb3Jt
ZWQgbGlrZSB0aGlzOg0KDQo9b3ZlciA0DQoNCj1pdGVtIFJvdW5kaW5nDQoN
CkJvdGggb3BlcmFuZHMgYXJlIHJvdW5kZWQgdG8gaGF2ZSBubyBtb3JlIHRo
YW4gY29udGV4dC0+cHJlY2lzaW9uIGRpZ2l0cy4NCg0KPWl0ZW0gQ29tcHV0
YXRpb24NCg0KVGhlIG9wZXJhdGlvbiBpcyBjb21wdXRlZC4NCg0KPWl0ZW0g
Um91bmRpbmcgb2YgcmVzdWx0DQoNClRoZSByZXN1bHQgaXMgdGhlbiByb3Vu
ZGVkIHRvIGNvbnRleHQtPnByZWNpc2lvbiBkaWdpdHMuDQoNCj1pdGVtIENv
bnZlcnNpb24gdG8gemVybyBhbmQgaW50ZWdlcmlzYXRpb24NCg0KSWYgdGhl
IHJlc3VsdCBpcyBlcXVhbCB0byB6ZXJvLCBpdCBpcyBtYWRlIGV4YWN0bHkg
emVyby4NCg0KV2hlcmUgdGhlIGxlbmd0aCBvZiB0aGUgY29lZmZpY2llbnQg
KyB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCBpcw0KbGVzcyB0aGFuIGNv
bnRleHQtPnByZWNpc2lvbiwgdGhlIHJlc3VsdCBpcyBjb252ZXJ0ZWQgaW50
byBhbiBpbnRlZ2VyLg0KDQo9YmFjaw0KDQpUaGUgZ2VuZXJhbCBmb3JtIGZv
ciBhbGwgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGlzDQoNCiB2b2lkIEJOX29w
ZXJhdGlvbihyZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0KQ0KDQo9Y3V0Ki8N
Cg0KLyo9aGVhZDIgQk5fYXJpdGhfc2V0dXAocmVzdWx0LCBvbmUsIHR3bywg
Y29udGV4dCkNCg0Kcm91bmRzIG9uZSBhbmQgdHdvIHJlYWR5IGZvciBhcml0
aG1ldGljIG9wZXJhdGlvbi4NCg0KPWN1dCovDQp2b2lkDQpCTl9hcml0aF9z
ZXR1cChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdO
VU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBCTl9zdHJpcF9s
ZWFkX3plcm9zKFBJTlRfIG9uZSk7DQogIEJOX3N0cmlwX2xlYWRfemVyb3Mo
UElOVF8gdHdvKTsNCiAgQk5fcm91bmQoUElOVF8gb25lLCBjb250ZXh0KTsN
CiAgQk5fcm91bmQoUElOVF8gdHdvLCBjb250ZXh0KTsNCn0NCg0KLyo9aGVh
ZDIgQk5fYXJpdGhfY2xlYW51cChyZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0
KQ0KDQpSb3VuZHMgcmVzdWx0LCBvbmUsIHR3bywgY2hlY2tzIGZvciB6ZXJv
bmVzcyBhbmQgbWFrZXMgaW50ZWdlcnMuDQoNCj1jdXQqLw0Kdm9pZA0KQk5f
YXJpdGhfY2xlYW51cChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAq
b25lLCBCSUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBC
Tl9yb3VuZChQSU5UXyBvbmUsIGNvbnRleHQpOw0KICBCTl9yb3VuZChQSU5U
XyB0d28sIGNvbnRleHQpOw0KICBCTl9zdHJpcF9sZWFkX3plcm9zKFBJTlRf
IHJlc3VsdCk7DQogIEJOX3JvdW5kKFBJTlRfIHJlc3VsdCwgY29udGV4dCk7
DQogIEJOX3JlYWxseV96ZXJvKFBJTlRfIHJlc3VsdCk7DQogIEJOX21ha2Vf
aW50ZWdlcihQSU5UXyByZXN1bHQsIGNvbnRleHQpOw0KfQ0KDQovKj1oZWFk
MiBCTl9hbGlnbihCSUdOVU0qIG9uZSwgQklHTlVNKiB0d28pIA0KDQpBZGRz
IHplcm8gZGlnaXRzIHNvIHRoYXQgZGVjaW1hbCBwb2ludHMgb2YgZWFjaCBu
dW1iZXIgYXJlIGF0IHRoZSBzYW1lDQpwbGFjZS4NCg0KPWN1dCovDQp2b2lk
IEJOX2FsaWduKFBJTlREXyBCSUdOVU0qIG9uZSwgQklHTlVNKiB0d28pIHsN
CiAgSU5UVkFMIGk7DQogIElOVFZBTCBkaWZmOw0KDQogIGRpZmYgPSBvbmUt
PmV4cG4gLSB0d28tPmV4cG47DQogIA0KICBpZiAoZGlmZiA9PSAwKSB7DQog
ICAgaWYgKG9uZS0+ZGlnaXRzIDwgdHdvLT5kaWdpdHMpIHsNCiAgICAgIEJJ
R05VTSAqdGVtcCA9IG9uZTsNCiAgICAgIG9uZSA9IHR3bzsNCiAgICAgIHR3
byA9IHRlbXA7DQogICAgfQ0KDQogICAgQk5fZ3JvdyhQSU5UXyB0d28sIG9u
ZS0+ZGlnaXRzKTsNCiAgICBmb3IgKGk9dHdvLT5kaWdpdHM7IGk8b25lLT5k
aWdpdHM7IGkrKykgew0KICAgICAgQk5fc2V0ZCh0d28sIGksIDApOw0KICAg
IH0NCiAgICB0d28tPmRpZ2l0cyA9IG9uZS0+ZGlnaXRzOw0KICB9DQogIGVs
c2UgaWYgKGRpZmYgPiAwKSB7IC8qIG9uZSA+IHR3bywgcHV0IDBzIGF0IHN0
YXJ0IG9mIHR3bywgZW5kIG9mIG9uZSAqLw0KICAgIEJOX2dyb3coUElOVF8g
b25lLCBvbmUtPmRpZ2l0cyArIGRpZmYpOw0KICAgIEJOX2dyb3coUElOVF8g
dHdvLCB0d28tPmRpZ2l0cyArIGRpZmYpOw0KDQogICAgZm9yIChpPXR3by0+
ZGlnaXRzOyBpPG9uZS0+ZGlnaXRzOyBpKyspIHsNCiAgICAgIEJOX3NldGQo
dHdvLCBpLCAwKTsNCiAgICB9DQogICAgdHdvLT5kaWdpdHMgPSBvbmUtPmRp
Z2l0czsNCiAgICBmb3IgKGk9b25lLT5kaWdpdHMgLTE7IGkgPiAtMTsgaS0t
KSB7DQogICAgICBCTl9zZXRkKG9uZSwgaSArIGRpZmYsIEJOX2dldGQob25l
LCBpKSk7DQogICAgfQ0KICAgIGZvciAoaT0wOyBpPGRpZmY7IGkrKykgew0K
ICAgICAgQk5fc2V0ZChvbmUsIGksIDApOw0KICAgIH0NCiAgICBDSEVDS19V
TkRFUkZMT1cob25lLT5leHBuLCBkaWZmLCBCTl9FWFBOX01JTiwgInVuZGVy
ZmxvdyBpbiBhbGlnbiIpOw0KICAgIG9uZS0+ZXhwbiAtPSBkaWZmOw0KICAg
IG9uZS0+ZGlnaXRzID0gdHdvLT5kaWdpdHMgPSBvbmUtPmRpZ2l0cyArIGRp
ZmY7DQogIH0NCiAgZWxzZSB7IC8qIG9uZSA8IHR3bywgcHV0IDBzIGF0IHN0
YXJ0IG9mIG9uZSwgZW5kIG9mIHR3byAqLw0KICAgIEJOX2dyb3coUElOVF8g
dHdvLCB0d28tPmV4cG4gKyBkaWZmKTsNCiAgICBCTl9ncm93KFBJTlRfIG9u
ZSwgdHdvLT5leHBuICsgZGlmZik7DQoNCiAgICBmb3IgKGk9b25lLT5kaWdp
dHM7IGk8dHdvLT5kaWdpdHM7IGkrKykgew0KICAgICAgQk5fc2V0ZChvbmUs
IGksIDApOw0KICAgIH0NCiAgICBvbmUtPmRpZ2l0cyA9IHR3by0+ZGlnaXRz
Ow0KICAgIGZvciAoaT10d28tPmRpZ2l0cyAtMTsgaSA+IC0xOyBpLS0pIHsN
CiAgICAgIEJOX3NldGQodHdvLCBpICsgZGlmZiwgQk5fZ2V0ZCh0d28sIGkp
KTsNCiAgICB9DQogICAgZm9yIChpPTA7IGk8ZGlmZjsgaSsrKSB7DQogICAg
ICBCTl9zZXRkKHR3bywgaSwgMCk7DQogICAgfQ0KICAgIENIRUNLX1VOREVS
RkxPVyh0d28tPmV4cG4sIGRpZmYsIEJOX0VYUE5fTUlOLCAidW5kZXJmbG93
IGluIGFsaWduIik7DQogICAgdHdvLT5leHBuIC09IGRpZmY7DQogICAgdHdv
LT5kaWdpdHMgPSBvbmUtPmRpZ2l0cyA9IHR3by0+ZGlnaXRzICsgZGlmZjsN
CiAgfQ0KfQ0KLyo9aGVhZDIgQk5fYWRkKEJJR05VTSogcmVzdWx0LCBCSUdO
VU0gKm9uZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpDQoN
Cj1jdXQqLw0Kdm9pZA0KQk5fYWRkKFBJTlREXyBCSUdOVU0qIHJlc3VsdCwg
QklHTlVNICpvbmUsIEJJR05VTSAqdHdvLCBCTl9DT05URVhUICpjb250ZXh0
KSB7DQogIEJOX2FyaXRoX3NldHVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28s
IGNvbnRleHQpOw0KDQogIC8qIERvIHdlIG1lYW4gYWRkLCBvciBkbyB3ZSBt
ZWFuIHN1YnRyYWN0PyAqLw0KICBpZiAob25lLT5zaWduICYmICF0d28tPnNp
Z24pIHsgICAgICAgICAgICAgLyogLWEgKyAgYiA9ICAoYi1hKSAqLw0KICAg
IEJOX2lzdWJ0cmFjdChQSU5UXyByZXN1bHQsIHR3bywgb25lLCBjb250ZXh0
KTsNCiAgfQ0KICBlbHNlIGlmIChvbmUtPnNpZ24gJiYgdHdvLT5zaWduKSB7
ICAgICAgICAgLyogLWEgKyAtYiA9IC0oYStiKSAqLw0KICAgIEJOX2lhZGQo
UElOVF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogICAgcmVzdWx0
LT5zaWduID0gMTsNCiAgfQ0KICBlbHNlIGlmICh0d28tPnNpZ24pIHsgICAg
ICAgICAgICAgICAgICAgICAgLyogIGEgKyAtYiA9ICAoYS1iKSAqLw0KICAg
IEJOX2lzdWJ0cmFjdChQSU5UXyByZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0
KTsNCiAgfQ0KICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLyogIGEgKyAgYiA9ICAoYStiKSAqLw0KICAgIEJOX2lhZGQo
UElOVF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogIH0NCg0KICBC
Tl9hcml0aF9jbGVhbnVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNvbnRl
eHQpOw0KfQ0KDQovKiBBY3R1YWwgYWRkaXRpb24gY29kZSwgYXNzdW1lcyB0
d28gcG9zaXRpdmUgb3BlcmFuZHMgYW5kDQogICBhbiBhbGxvY2F0ZWQgcmVz
dWx0IG9iamVjdCBhbmQgY29udGV4dCAqLw0Kdm9pZCBCTl9pYWRkIChQSU5U
RF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdOVU0gKnR3bywg
Qk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBJTlRWQUwgaTsNCiAgaW50IGNh
cnJ5LCBkaWc7DQoNCiAgQk5fYWxpZ24oUElOVF8gb25lLCB0d28pOw0KICBC
Tl9ncm93KFBJTlRfIHJlc3VsdCwgb25lLT5kaWdpdHMgKyAxKTsNCg0KICBj
YXJyeSA9IDA7DQogIGZvciAoaT0wOyBpPCBvbmUtPmRpZ2l0czsgaSsrKSB7
DQogICAgY2FycnkgKz0gQk5fZ2V0ZChvbmUsIGkpICsgQk5fZ2V0ZCh0d28s
IGkpOw0KICAgIGRpZyA9IGNhcnJ5ICUgMTA7DQogICAgQk5fc2V0ZChyZXN1
bHQsIGksIGRpZyk7DQogICAgY2FycnkgPSBjYXJyeSAvIDEwOw0KICB9DQog
IGlmIChjYXJyeSkgew0KICAgIEJOX3NldGQocmVzdWx0LCBpLCBjYXJyeSk7
DQogICAgcmVzdWx0LT5kaWdpdHMgPSBpKzE7DQogIH0NCiAgZWxzZSB7DQog
ICAgcmVzdWx0LT5kaWdpdHMgPSBpOw0KICB9DQogIHJlc3VsdC0+c2lnbiA9
IDA7DQogIHJlc3VsdC0+ZXhwbiA9IG9uZS0+ZXhwbjsNCn0NCg0KLyo9aGVh
ZDIgQk5fc3VidHJhY3QoQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
SUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkNCg0KPWN1dCovDQp2
b2lkDQpCTl9zdWJ0cmFjdChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05V
TSAqb25lLCBCSUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0K
DQogIEJOX2FyaXRoX3NldHVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNv
bnRleHQpOw0KDQogIC8qIERvIHdlIG1lYW4gc3VidHJhY3QsIG9yIGRvIHdl
IG1lYW4gYWRkPyAqLw0KICBpZiAob25lLT5zaWduICYmICF0d28tPnNpZ24p
IHsgICAgICAgICAvKiAtYSAtICBiID0gLShhK2IpICovDQogICAgQk5faWFk
ZChQSU5UXyByZXN1bHQsIG9uZSwgdHdvLCBjb250ZXh0KTsNCiAgICByZXN1
bHQtPnNpZ24gPSAxOw0KICB9DQogIGVsc2UgaWYgKG9uZS0+c2lnbiAmJiB0
d28tPnNpZ24pIHsgICAgIC8qIC1hIC0gLWIgPSAoYi1hKSAgKi8NCiAgICBC
Tl9pc3VidHJhY3QoUElOVF8gcmVzdWx0LCB0d28sIG9uZSwgY29udGV4dCk7
DQogIH0NCiAgZWxzZSBpZiAodHdvLT5zaWduKSB7ICAgICAgICAgICAgICAg
ICAgLyogIGEgLSAtYiA9IChhK2IpICAqLw0KICAgIEJOX2lhZGQoUElOVF8g
cmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogIH0NCiAgZWxzZSB7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGEgLSAgYiA9IChh
LWIpICAqLw0KICAgIEJOX2lzdWJ0cmFjdChQSU5UXyByZXN1bHQsIG9uZSwg
dHdvLCBjb250ZXh0KTsNCiAgfQ0KDQogIEJOX2FyaXRoX2NsZWFudXAoUElO
VF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQp9DQoNCnZvaWQNCkJO
X2lzdWJ0cmFjdCAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9u
ZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpIHsNCiAgSU5U
VkFMIGk7DQogIGludCBjYXJyeSwgZGlnOw0KDQogIEJOX2FsaWduKFBJTlRf
IG9uZSwgdHdvKTsNCg0KICAvKiBhcyBhLWIgPT0gLShiLWEpLCB3ZSBmaW5k
IGxhcmdlciBvZiBhIGFuZCBiIGFuZCBtYWtlIHN1cmUgaXQgaXMgaW4gb25l
ICovDQogIGNhcnJ5ID0gMDsNCiAgZm9yIChpPW9uZS0+ZGlnaXRzIC0xOyBp
Pi0xOyBpLS0pIHsNCiAgICBjYXJyeSA9IEJOX2dldGQob25lLCBpKSAtIEJO
X2dldGQodHdvLCBpKTsNCiAgICBpZiAoY2FycnkpIGJyZWFrOw0KICB9DQoN
CiAgaWYgKCFjYXJyeSkgeyAvKiBhPT1iKi8NCiAgICByZXN1bHQtPmRpZ2l0
cyA9IDE7DQogICAgcmVzdWx0LT5zaWduID0gMDsNCiAgICBCTl9zZXRkKHJl
c3VsdCwgMCwwKTsNCiAgICByZXR1cm47DQogIH0NCiAgZWxzZSBpZiAoY2Fy
cnkgPCAwKSB7IC8qIGIgPiBhICovDQogICAgQk5faXN1YnRyYWN0KFBJTlRf
IHJlc3VsdCwgdHdvLCBvbmUsIGNvbnRleHQpOw0KICAgIHJlc3VsdC0+c2ln
biA9IDE7DQogIH0NCiAgZWxzZSB7DQogICAgQk5fZ3JvdyhQSU5UXyByZXN1
bHQsIG9uZS0+ZGlnaXRzICsgMSk7DQoNCiAgICBjYXJyeSA9IDA7DQogICAg
Zm9yIChpPTA7IGk8b25lLT5kaWdpdHM7IGkrKykgew0KICAgICAgY2Fycnkg
PSBjYXJyeSArIEJOX2dldGQob25lLCBpKSAtIEJOX2dldGQodHdvLGkpOw0K
ICAgICAgaWYgKGNhcnJ5IDwgMCkgew0KCUJOX3NldGQocmVzdWx0LCBpLCAx
MCtjYXJyeSk7DQoJY2FycnkgPSAtMTsNCiAgICAgIH0NCiAgICAgIGVsc2Ug
ew0KCUJOX3NldGQocmVzdWx0LCBpLCBjYXJyeSk7DQoJY2FycnkgPSAwOw0K
ICAgICAgfQ0KICAgIH0NCg0KICAgIGFzc2VydCghY2FycnkpOyAvKiBhcyB0
byBnZXQgaGVyZSBhID4gYiovDQoNCiAgICByZXN1bHQtPmRpZ2l0cyA9IG9u
ZS0+ZGlnaXRzOw0KICAgIHJlc3VsdC0+ZXhwbiA9IG9uZS0+ZXhwbjsNCiAg
ICByZXN1bHQtPnNpZ24gPSAwOw0KICB9DQoNCn0NCg0KLyo9aGVhZDIgQk5f
cGx1cyhyZXN1bHQsIG9uZSwgY29udGV4dCkgDQoNClBlcmZvcm0gdW5hcnkg
KyBvbiBvbmUuICBEb2VzIGFsbCB0aGUgcm91bmRpbmcgYW5kIHdoYXQgaGF2
ZSB5b3UuDQoNCj1jdXQqLw0Kdm9pZCBCTl9wbHVzKFBJTlREXyBCSUdOVU0q
IHJlc3VsdCwgQklHTlVNICpvbmUsIEJOX0NPTlRFWFQgKmNvbnRleHQpIHsN
CiAgQk5fYXJpdGhfc2V0dXAoUElOVF8gcmVzdWx0LCBvbmUsIG9uZSwgY29u
dGV4dCk7DQogIEJOX2NvcHkoUElOVF8gcmVzdWx0LCBvbmUpOw0KICBCTl9h
cml0aF9jbGVhbnVwKFBJTlRfIHJlc3VsdCwgb25lLCBvbmUsIGNvbnRleHQp
Ow0KfQ0KDQovKj1oZWFkMiBCTl9taW51cyhyZXN1bHQsIG9uZSwgY29udGV4
dCkgDQoNClBlcmZvcm0gdW5hcnkgLSBvbiBvbmUuICBEb2VzIGFsbCB0aGUg
cm91bmRpbmcgYW5kIHdoYXQgaGF2ZSB5b3UuDQoNCj1jdXQqLw0Kdm9pZCBC
Tl9taW51cyhQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
Tl9DT05URVhUICpjb250ZXh0KSB7DQogIEJOX2FyaXRoX3NldHVwKFBJTlRf
IHJlc3VsdCwgb25lLCBvbmUsIGNvbnRleHQpOw0KICBCTl9jb3B5KFBJTlRf
IHJlc3VsdCwgb25lKTsNCiAgcmVzdWx0LT5zaWduID0gcmVzdWx0LT5zaWdu
ID8gMCA6IDE7DQogIEJOX2FyaXRoX2NsZWFudXAoUElOVF8gcmVzdWx0LCBv
bmUsIG9uZSwgY29udGV4dCk7DQp9DQoNCi8qPWhlYWQyIEJOX2NvbXBhcmUo
cmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCkNCg0KTnVtZXJpY2FsbHkgY29t
cGFyZXMgb25lIGFuZCB0d28sIHN0b3JpbmcgdGhlIHJlc3VsdCAoYXMgYSBC
SUdOVU0pIGluDQpyZXN1bHQuDQoNCiByZXN1bHQgPSAxICA9PiBvbmUgPiB0
d28NCiByZXN1bHQgPSAtMSA9PiB0d28gPiBvbmUNCiByZXN1bHQgPSAwICA9
PiBvbmUgPT0gdHdvDQoNCj1jdXQqLw0Kdm9pZA0KQk5fY29tcGFyZSAoUElO
VF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdOVU0gKnR3bywg
Qk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBJTlRWQUwgaSxqOw0KICBpbnQg
Y21wOw0KICANCiAgQk5fYXJpdGhfc2V0dXAoUElOVF8gcmVzdWx0LCBvbmUs
IHR3bywgY29udGV4dCk7DQogIHJlc3VsdC0+ZGlnaXRzID0gMTsNCiAgcmVz
dWx0LT5leHBuID0gMDsNCg0KICBpZiAob25lLT5zaWduICE9IHR3by0+c2ln
bikgew0KICAgIHJlc3VsdC0+c2lnbiA9IG9uZS0+c2lnbjsNCiAgICBCTl9z
ZXRkKHJlc3VsdCwgMCwgMSk7DQogIH0NCiAgZWxzZSBpZiAob25lLT5leHBu
ICsgb25lLT5kaWdpdHMgPiB0d28tPmV4cG4gKyB0d28tPmRpZ2l0cykgew0K
ICAgIHJlc3VsdC0+c2lnbiA9IG9uZS0+c2lnbjsNCiAgICBCTl9zZXRkKHJl
c3VsdCwgMCwgMSk7DQogIH0NCiAgZWxzZSBpZiAob25lLT5leHBuICsgb25l
LT5kaWdpdHMgPCB0d28tPmV4cG4gKyB0d28tPmRpZ2l0cykgew0KICAgIHJl
c3VsdC0+c2lnbiA9IG9uZS0+c2lnbiA/IDA6MTsNCiAgICBCTl9zZXRkKHJl
c3VsdCwgMCwgMSk7DQogIH0NCiAgZWxzZSB7IC8qIFNhbWUgc2lnbiwgc2Ft
ZSAic2l6ZSIgKi8NCiAgICBmb3IgKGk9MDsgaTxvbmUtPmRpZ2l0cyAmJiBp
PHR3by0+ZGlnaXRzOyBpKyspIHsNCiAgICAgIGNtcCA9IEJOX2dldGQob25l
LCBvbmUtPmRpZ2l0cy0xLWkpIC0gQk5fZ2V0ZCh0d28sIHR3by0+ZGlnaXRz
LTEtaSk7DQogICAgICBpZiAoY21wKSBicmVhazsNCiAgICB9DQogICAgaWYg
KCFjbXApIHsNCiAgICAgIGlmIChpPT1vbmUtPmRpZ2l0cykgew0KCWZvciAo
aT1pOyBpPHR3by0+ZGlnaXRzOyBpKyspIHsNCgkgIGNtcCA9IDAtQk5fZ2V0
ZCh0d28sIHR3by0+ZGlnaXRzLTEtaSk7DQoJICBpZiAoY21wKSBicmVhazsN
Cgl9DQogICAgICB9DQogICAgICBlbHNlIGlmIChpPT10d28tPmRpZ2l0cykg
ew0KCWZvciAoaT1pOyBpPG9uZS0+ZGlnaXRzOyBpKyspIHsNCgkgIGNtcCA9
IEJOX2dldGQob25lLCBvbmUtPmRpZ2l0cy0xLWkpOw0KCSAgaWYgKGNtcCkg
YnJlYWs7DQoJfQ0KICAgICAgfQ0KICAgIH0NCiAgICAvKiBub3cgY2hlY2sg
dGhlIHZhbHVlIG9mIGNtcCAqLw0KICAgIGlmIChjbXAgPiAwKSB7DQogICAg
ICByZXN1bHQtPnNpZ24gPSBvbmUtPnNpZ247DQogICAgICBCTl9zZXRkKHJl
c3VsdCwgMCwgMSk7DQogICAgfQ0KICAgIGVsc2UgaWYgKGNtcCA8IDApIHsN
CiAgICAgIHJlc3VsdC0+c2lnbiA9IG9uZS0+c2lnbiA/IDAgOiAxOw0KICAg
ICAgQk5fc2V0ZChyZXN1bHQsIDAsIDEpOw0KICAgIH0NCiAgICBlbHNlIHsN
CiAgICAgIHJlc3VsdC0+c2lnbiA9IDA7DQogICAgICBCTl9zZXRkKHJlc3Vs
dCwwLDApOw0KICAgIH0NCiAgfQ0KDQogIEJOX2FyaXRoX2NsZWFudXAoUElO
VF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQp9DQoNCi8qPWhlYWQy
IEJOX211bHRpcGx5KHJlc3VsdCwgb25lLCB0d28sIGNvbnRleHQpIA0KDQpN
dWx0aXBsaWVzIG9uZSBhbmQgdHdvLCBzdG9yaW5nIHRoZSByZXN1bHQgaW4g
cmVzdWx0Lg0KDQo9Y3V0Ki8NCnZvaWQgDQpCTl9tdWx0aXBseSAoUElOVERf
IEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklHTlVNICp0d28sIEJO
X0NPTlRFWFQgKmNvbnRleHQpIHsNCiAgSU5UVkFMIGksajsNCiAgaW50IGNh
cnJ5LCBkaWc7DQoNCiAgQk5fYXJpdGhfc2V0dXAoUElOVF8gcmVzdWx0LCBv
bmUsIHR3bywgY29udGV4dCk7DQoNCiAgQk5fZ3JvdyhQSU5UXyByZXN1bHQs
IG9uZS0+ZGlnaXRzICsgdHdvLT5kaWdpdHMgKyAyKTsNCiAgLyogemVybyBj
b250ZW50cyBvZiByZXN1bHQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBp
bnRlcm1lZGlhdGUgKi8NCiAgZm9yIChpPTA7IGk8b25lLT5kaWdpdHMgKyB0
d28tPmRpZ2l0cyArMjsgaSsrKQ0KICAgIEJOX3NldGQocmVzdWx0LCBpLCAw
KTsNCg0KICAvKiBtYWtlIHN1cmUgbGFyZ2VzdCBjb2VmZiBpcyBpbiBvbmUg
Ki8NCiAgaWYgKG9uZS0+ZGlnaXRzIDwgdHdvLT5kaWdpdHMpIHsNCiAgICBC
SUdOVU0qIHRlbXAgPSBvbmU7DQogICAgb25lID0gdHdvOw0KICAgIHR3byA9
IHRlbXA7DQogIH0NCg0KICBmb3IgKGk9MDsgaTx0d28tPmRpZ2l0czsgaSsr
KSB7DQogICAgZGlnID0gQk5fZ2V0ZCh0d28sIGkpOw0KICAgIGNhcnJ5ID0g
MDsNCiAgICBmb3IgKGo9MDsgajxvbmUtPmRpZ2l0czsgaisrKSB7DQogICAg
ICBjYXJyeSArPSBCTl9nZXRkKG9uZSxqKSAqIGRpZyArIEJOX2dldGQocmVz
dWx0LCBpK2opOw0KICAgICAgQk5fc2V0ZChyZXN1bHQsIGkraiwgY2Fycnkg
JSAxMCk7DQogICAgICBjYXJyeSA9IGNhcnJ5IC8gMTA7DQogICAgfQ0KICAg
IGlmIChjYXJyeSkgew0KICAgICAgQk5fc2V0ZChyZXN1bHQsIGkraiwgY2Fy
cnkpOw0KICAgIH0NCiAgfQ0KICBpZiAoY2FycnkpIHsNCiAgICByZXN1bHQt
PmRpZ2l0cyA9IG9uZS0+ZGlnaXRzICsgdHdvLT5kaWdpdHMgKyAxOw0KICB9
DQogIGVsc2UgaWYgKEJOX2dldGQocmVzdWx0LCBvbmUtPmRpZ2l0cyArIHR3
by0+ZGlnaXRzIC0gMSkpIHsNCiAgICByZXN1bHQtPmRpZ2l0cyA9IG9uZS0+
ZGlnaXRzICsgdHdvLT5kaWdpdHM7DQogIH0NCiAgZWxzZSB7DQogICAgcmVz
dWx0LT5kaWdpdHMgPSBvbmUtPmRpZ2l0cyArIHR3by0+ZGlnaXRzIC0gMTsN
CiAgfQ0KICANCiAgaSA9IG9uZS0+ZXhwbiArIHR3by0+ZXhwbjsNCiAgQ0hF
Q0tfT1ZFUkZMT1cocmVzdWx0LT5leHBuLCBpLCBCTl9FWFBOX01BWCwgIm92
ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIik7DQogIENIRUNLX1VOREVSRkxP
VyhyZXN1bHQtPmV4cG4sLWksIEJOX0VYUE5fTUlOLCAidW5kZXJmbG93IGlu
IG11bHRpcGxpYWN0aW9uIik7DQogIHJlc3VsdC0+ZXhwbiA9IGk7DQogIA0K
ICByZXN1bHQtPnNpZ24gPSAxICYgKG9uZS0+c2lnbiBeIHR3by0+c2lnbik7
DQoNCiAgQk5fYXJpdGhfY2xlYW51cChQSU5UXyByZXN1bHQsIG9uZSwgdHdv
LCBjb250ZXh0KTsNCn0NCg0KLyo9aGVhZDIgQk5fZGl2aWRlKHJlc3VsdCwg
b25lLCB0d28sIGNvbnRleHQpDQoNCkRpdmlkZSB0d28gaW50byBvbmUsIHN0
b3JpbmcgdXAgdG8gSTxwcmVjaXNpb24+IGRpZ2l0cyBpbiByZXN1bHQuDQpQ
ZXJmb3JtcyBvd24gcm91bmRpbmcuDQoNCj1jdXQqLw0KDQp2b2lkIEJOX2Rp
dmlkZShQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCSUdO
VU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCkgew0KICBCSUdOVU0qIHJl
bSA9IEJOX25ldyhQSU5UXyAxKTsNCiAgQk5fYXJpdGhfc2V0dXAoUElOVF8g
cmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCk7DQogIEJOX2lkaXZpZGUoUElO
VF8gcmVzdWx0LCBvbmUsIHR3bywgY29udGV4dCwgQk5fRElWX0RJVklERSwg
cmVtKTsNCg0KICAvKiBVc2UgcmVtIHRvIHdvcmsgb3V0IHRoaW5ncyBsaWtl
IHJvdW5kaW5nIGhlcmUsIHdlJ2xsIGRvIG91cg0KICAgICBvd24gY2xlYW4g
dXAgYXMgaXQncyBhbGwgYSBsaXR0bGUgb2RkICovDQogIEJOX3JvdW5kKFBJ
TlRfIG9uZSwgY29udGV4dCk7DQogIEJOX3JvdW5kKFBJTlRfIHR3bywgY29u
dGV4dCk7DQogIEJOX3N0cmlwX2xlYWRfemVyb3MoUElOVF8gcmVzdWx0KTsN
Cg0KICBpZiAoY29udGV4dC0+cHJlY2lzaW9uID09IFJPVU5EX0hBTEZfRVZF
Tikgew0KICAgIGlmIChyZXN1bHQtPmRpZ2l0cyA+IGNvbnRleHQtPnByZWNp
c2lvbikgew0KICAgICAgaWYgKGNvbnRleHQtPmxvc3RfZGlnaXRzKSB7DQoJ
Qk5fRVhDRVBUKFBJTlRfIEJOX0xPU1RfRElHSVRTLCAiZGlnaXRzIGxvc3Qg
YWZ0ZXIgZGl2aXNpb24iKTsNCiAgICAgIH0NCiAgICAgIC8qIFdlIGNvbGxl
Y3RlZCBwcmVjaXNpb24gKyAxIGRpZ2l0cy4uLiAqLw0KICAgICAgQk5fcmVh
bGx5X3plcm8oUElOVF8gcmVtKTsNCiAgICAgIGlmIChCTl9nZXRkKHJlc3Vs
dCwgMCkgPiA1KSB7DQoJQk5fcm91bmRfdXAoUElOVF8gcmVzdWx0LCBjb250
ZXh0KTsNCiAgICAgIH0NCiAgICAgIGVsc2UgaWYgKEJOX2dldGQocmVzdWx0
LCAwKSA9PSA1KSB7DQoJaWYgKHJlbS0+ZGlnaXRzID09IDAgJiYgQk5fZ2V0
ZChyZW0sIDApPT0wKSB7DQoJICBzd2l0Y2ggKEJOX2dldGQocmVzdWx0LCAx
KSkgew0KCSAgY2FzZSAwOg0KCSAgY2FzZSAyOg0KCSAgY2FzZSA0Og0KCSAg
Y2FzZSA2Og0KCSAgY2FzZSA4Og0KCSAgICBCTl9yb3VuZF91cChQSU5UXyBy
ZXN1bHQsIGNvbnRleHQpOw0KCSAgICBicmVhazsNCgkgIGRlZmF1bHQgOg0K
CSAgICBCTl9yb3VuZF9kb3duKFBJTlRfIHJlc3VsdCwgY29udGV4dCk7DQoJ
ICB9DQoJfQ0KCWVsc2Ugew0KCSAgQk5fcm91bmRfdXAoUElOVF8gcmVzdWx0
LCBjb250ZXh0KTsNCgl9DQogICAgICB9DQogICAgICBlbHNlIHsNCglCTl9y
b3VuZF9kb3duKFBJTlRfIHJlc3VsdCwgY29udGV4dCk7DQogICAgICB9DQog
ICAgfQ0KICAgIA0KICB9DQogIGVsc2UgeyAvKiBPdGhlciByb3VuZGluZ3Mg
anVzdCBuZWVkIGRpZ2l0cyB0byBwbGF5IHdpdGggKi8NCiAgICBCTl9yb3Vu
ZChQSU5UXyByZXN1bHQsIGNvbnRleHQpOw0KICB9DQogIEJOX3JlYWxseV96
ZXJvKFBJTlRfIHJlc3VsdCk7DQogIEJOX21ha2VfaW50ZWdlcihQSU5UXyBy
ZXN1bHQsIGNvbnRleHQpOw0KICAvKiBSZW1vdmUgdHJhaWxpbmcgemVyb3Mg
aWYgcG9zaXRpdmUgZXhwb25lbnQgKi8NCiAgaWYgKHJlc3VsdC0+ZXhwbiA+
IDApIHsNCiAgICBJTlRWQUwgaSxqOw0KICAgIGZvciAoaT0wOyBpPHJlc3Vs
dC0+ZGlnaXRzOyBpKyspIHsNCiAgICAgIGlmIChCTl9nZXRkKHJlc3VsdCwg
aSkgIT0gMCkgYnJlYWs7DQogICAgfQ0KICAgIGlmIChpKSB7DQogICAgICBm
b3IgKGo9aTsgajxyZXN1bHQtPmRpZ2l0czsgaisrKSB7DQoJQk5fc2V0ZChy
ZXN1bHQsIGotaSwgQk5fZ2V0ZChyZXN1bHQsIGopKTsNCiAgICAgIH0NCiAg
ICB9DQogICAgQ0hFQ0tfT1ZFUkZMT1cocmVzdWx0LT5leHBuLCBpLCBCTl9F
WFBOX01BWCwgIm92ZXJmbG93IGluIGRpdmlkZSIpOw0KICAgIHJlc3VsdC0+
ZXhwbiArPSBpOw0KICB9DQogIA0KICBCTl9kZXN0cm95KFBJTlRfIHJlbSk7
DQp9DQoNCi8qPWhlYWQyIEJOX2RpdmlkZV9pbnRlZ2VyKHJlc3VsdCwgb25l
LCB0d28sIGNvbnRleHQpDQoNCnBsYWNlcyB0aGUgaW50ZWdlciBwYXJ0IG9m
IG9uZSAvIHR3byBpbnRvIHJlc3VsdC4NCg0KPWN1dCovDQp2b2lkDQpCTl9k
aXZpZGVfaW50ZWdlciAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0g
Km9uZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpIHsNCiAg
QklHTlVNKiByZW0gPSBCTl9uZXcoUElOVF8gMSk7DQogIEJOX2FyaXRoX3Nl
dHVwKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNvbnRleHQpOw0KICBCTl9p
ZGl2aWRlKFBJTlRfIHJlc3VsdCwgb25lLCB0d28sIGNvbnRleHQsIEJOX0RJ
Vl9ESVZJTlQsIHJlbSk7DQogIA0KICBCTl9yZWFsbHlfemVybyhQSU5UXyBy
ZW0pOw0KICBpZiAocmVzdWx0LT5leHBuID4wICYmIA0KICAgICAgcmVzdWx0
LT5leHBuICsgcmVzdWx0LT5kaWdpdHMgPiBjb250ZXh0LT5wcmVjaXNpb24g
JiYNCiAgICAgICEocmVtLT5kaWdpdHMgPT0gMCAmJiBCTl9nZXRkKHJlbSwg
MCkgPT0gMCkpIHsNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fRElWSVNJT05f
SU1QT1NTSUJMRSwNCgkgICAgICAiZGl2aWRlLWludGVnZXIgcmVxdWlyZXMg
bW9yZSBwcmVjaXNpb24gdGhhbiBhdmFpbGFibGUiKTsNCiAgfQ0KICBCTl9k
ZXN0cm95KFBJTlRfIHJlbSk7DQogIGlmIChyZXN1bHQtPmV4cG4gIT0gMCkg
ew0KICAgIElOVFZBTCBpOw0KICAgIEJOX2dyb3coUElOVF8gcmVzdWx0LCBy
ZXN1bHQtPmV4cG4gKyByZXN1bHQtPmRpZ2l0cyk7DQogICAgZm9yIChpPTA7
IGk8cmVzdWx0LT5kaWdpdHM7IGkrKykgew0KICAgICAgQk5fc2V0ZChyZXN1
bHQsIHJlc3VsdC0+ZXhwbiArIHJlc3VsdC0+ZGlnaXRzIC0xIC1pLCBCTl9n
ZXRkKHJlc3VsdCwgaSkpOw0KICAgIH0NCiAgICBmb3IgKGk9MDsgaTxyZXN1
bHQtPmV4cG47IGkrKykgew0KICAgICAgQk5fc2V0ZChyZXN1bHQsIGkgLDAp
Ow0KICAgIH0NCiAgICByZXN1bHQtPmRpZ2l0cyArPSByZXN1bHQtPmV4cG47
DQogICAgcmVzdWx0LT5leHBuID0gMDsNCiAgfQ0KICBCTl9yb3VuZChQSU5U
XyBvbmUsIGNvbnRleHQpOw0KICBCTl9yb3VuZChQSU5UXyB0d28sIGNvbnRl
eHQpOw0KICBCTl9tYWtlX2ludGVnZXIoUElOVF8gcmVzdWx0LCBjb250ZXh0
KTsNCn0NCg0KLyo9aGVhZDIgQk5fcmVtYWluZGVyKHJlc3VsdCwgb25lLCB0
d28sIGNvbnRleHQpDQoNCnBsYWNlcyB0aGUgcmVtYWluZGVyIGZyb20gZGl2
aWRlLWludGVnZXIgKGFib3ZlKSBpbnRvIHJlc3VsdC4NCg0KPWN1dCovDQp2
b2lkDQpCTl9yZW1haW5kZXIgKFBJTlREXyBCSUdOVU0qIHJlc3VsdCwgQklH
TlVNICpvbmUsIEJJR05VTSAqdHdvLCBCTl9DT05URVhUICpjb250ZXh0KSB7
DQogIEJJR05VTSogZmFrZSA9IEJOX25ldygxKTsNCiAgDQogIEJOX2lkaXZp
ZGUoUElOVF8gZmFrZSwgb25lLCB0d28sIGNvbnRleHQsIEJOX0RJVl9SRU1B
SU4sIHJlc3VsdCk7DQoNCiAgQk5fcmVhbGx5X3plcm8oUElOVF8gcmVzdWx0
KTsNCiAgaWYgKGZha2UtPmV4cG4gPjAgJiYgDQogICAgICBmYWtlLT5leHBu
ICsgcmVzdWx0LT5kaWdpdHMgPiBjb250ZXh0LT5wcmVjaXNpb24gJiYNCiAg
ICAgICEocmVzdWx0LT5kaWdpdHMgPT0gMCAmJiBCTl9nZXRkKHJlc3VsdCwg
MCkgPT0gMCkpIHsNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fRElWSVNJT05f
SU1QT1NTSUJMRSwNCgkgICAgICAicmVtYWluZGVyIHJlcXVpcmVzIG1vcmUg
cHJlY2lzaW9uIHRoYW4gYXZhaWxhYmxlIik7DQogIH0NCg0KDQogIEJOX2Rl
c3Ryb3koUElOVF8gZmFrZSk7DQoNCiAgQk5fcm91bmQoUElOVF8gb25lLCBj
b250ZXh0KTsNCiAgQk5fcm91bmQoUElOVF8gdHdvLCBjb250ZXh0KTsNCiAg
Qk5fc3RyaXBfbGVhZF96ZXJvcyhQSU5UXyByZXN1bHQpOw0KICBCTl9yb3Vu
ZChQSU5UXyByZXN1bHQsIGNvbnRleHQpOw0KICBCTl9yZWFsbHlfemVybyhQ
SU5UXyByZXN1bHQpOw0KfQ0KDQovKiBEb2VzIHRoZSBoZWF2eSB3b3JrIGZv
ciB0aGUgdmFyaW91cyBkaXZpc2lvbiB3b3NzbmFtZXMgKi8NCnZvaWQNCkJO
X2lkaXZpZGUgKFBJTlRfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwg
QklHTlVNICp0d28sDQogICAgICAgICAgICBCTl9DT05URVhUICpjb250ZXh0
LCBCTl9ESVZfRU5VTSBvcGVyYXRpb24sIEJJR05VTSogcmVtKXsNCiAgSU5U
VkFMIGksIGosIGRpdmlkZWQsIG5ld2V4cG47DQogIEJJR05VTSAqZGl2LCp0
MSwgKnQyOw0KICBpbnQgczIsIHZhbHVlOw0KDQogIC8qIEFyZSB3ZSBkb2lu
ZyBzb21ldGhpbmcgc3R1cGlkLCBjYW4gd2Ugc2tpcCBhbGwgdGhlIGhhc3Ns
ZT8gKi8NCiAgaWYgKG9uZS0+ZGlnaXRzID09IDEgJiYgQk5fZ2V0ZChvbmUs
IDApPT0wKSB7DQogICAgaWYgKHR3by0+ZGlnaXRzID09IDEgJiYgQk5fZ2V0
ZCh0d28sIDApPT0wKXsNCiAgICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9ESVZJ
U0lPTl9VTkRFRklORUQsICIwLzAgaW4gZGl2aXNpb24iKTsNCiAgICB9DQog
ICAgcmVzdWx0LT5kaWdpdHMgPSAxOw0KICAgIHJlc3VsdC0+c2lnbiA9IDA7
DQogICAgQk5fc2V0ZChyZXN1bHQsIDAsIDApOw0KICAgIHJldHVybjsNCiAg
fQ0KICBpZiAodHdvLT5kaWdpdHMgPT0gMSkgew0KICAgIGlmIChCTl9nZXRk
KHR3bywgMCk9PTApIHsNCiAgICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9ESVZJ
U0lPTl9CWV9aRVJPLCAieC8wIGluIGRpdmlzaW9uIik7DQogICAgfQ0KICAg
IGlmIChCTl9nZXRkKHR3bywwKT09MSkgeyAvKiB4IC8gMSoqTiAqLw0KICAg
ICAgQk5fY29weShQSU5UXyByZXN1bHQsIG9uZSk7DQogICAgICByZXN1bHQt
PnNpZ24gPSAxJihvbmUtPnNpZ24gXiB0d28tPnNpZ24pOw0KICAgICAgQ0hF
Q0tfVU5ERVJGTE9XKHJlc3VsdC0+ZXhwbiwgdHdvLT5leHBuIC0gb25lLT5l
eHBuLCBCTl9FWFBOX01JTiwNCgkJICAgICAgIlVuZGVyZmxvdyBpbiBkaXZp
c2lvbiIpOw0KICAgICAgQ0hFQ0tfT1ZFUkZMT1cocmVzdWx0LT5leHBuLCBv
bmUtPmV4cG4tdHdvLT5leHBuLCBCTl9FWFBOX01BWCwNCgkJICAgICAiT3Zl
cmZsb3cgaW4gZGl2aXNpb24iKTsNCiAgICAgIHJlc3VsdC0+ZXhwbiA9IG9u
ZS0+ZXhwbiAtIHR3by0+ZXhwbjsNCiAgICAgIHJldHVybjsNCiAgICB9DQog
IH0NCiAgLyogVGhhdCdzIHF1aXRlIGVub3VnaCBzaG9ydGN1dHMgZm9yIG5v
dy4uLiAqLw0KDQogIC8qIE1ha2Ugc29tZSB0ZW1wb3Jhcmllcywgc2V0IGFs
bCBzaWducyB0byBwb3NpdGl2ZSBmb3Igc2ltcGxpY2l0eSAqLw0KICAvKiBX
ZSB1c2UgcmVzdWx0IGFzIGEgdGVtcG9yeSwgYW5kIHN0b3JlIHRoZSByZXZl
cnNlZCByZXN1bHQgaW4gdDIgKi8NCiAgZGl2ID0gQk5fbmV3KFBJTlRfIDEp
Ow0KICBCTl9jb3B5KFBJTlRfIGRpdiwgb25lKTsNCiAgQk5fY29weShQSU5U
XyByZW0sIGRpdik7IC8qIEluIGNhc2UgZG9pbmcgaW50LWRpdiBhbmQgZG9u
J3QgZGl2Ki8NCiAgZGl2LT5zaWduID0gMDsNCiAgdDEgPSBCTl9uZXcoUElO
VF8gMSk7DQogIHQyID0gQk5fbmV3KFBJTlRfIDEpOw0KICBCTl9ncm93KFBJ
TlRfIHQyLCBjb250ZXh0LT5wcmVjaXNpb24rMSk7DQogIHQyLT5kaWdpdHMg
PSAwOw0KICBzMiA9IHR3by0+c2lnbjsNCiAgdHdvLT5zaWduID0gMDsNCiAg
cmVzdWx0LT5kaWdpdHMgPSAxOw0KICByZW0tPmRpZ2l0cyA9IDE7DQoNCiAg
LyogRmlyc3QgcG9zaXRpb24gdG8gdHJ5IHRvIGZpbGwgKi8NCiAgbmV3ZXhw
biA9IG9uZS0+ZGlnaXRzICsgb25lLT5leHBuIC0gdHdvLT5kaWdpdHMgLSB0
d28tPmV4cG47DQogIENIRUNLX09WRVJGTE9XKHQxLT5leHBuLCBuZXdleHBu
LCBCTl9FWFBOX01BWCwgIm92ZXJmbG93IGluIGRpdmlkZSIpOw0KICBDSEVD
S19VTkRFUkZMT1codDEtPmV4cG4sIC1uZXdleHBuLCBCTl9FWFBOX01JTiwg
InVuZGVyZmxvdyBpbiBkaXZpZGUiKTsNCiAgdDEtPmV4cG4gPSBuZXdleHBu
Ow0KDQogIHZhbHVlID0gMDsNCiAgZm9yICg7Oykgew0KICAgIGRpdmlkZWQg
PSAwOw0KICAgIGZvciAoaj0xOyBqPDEwO2orKykgew0KICAgICAgQk5fc2V0
ZCh0MSwgMCwgaik7DQogICAgICBCTl9tdWx0aXBseShQSU5UXyByZXN1bHQs
IHQxLCB0d28sIGNvbnRleHQpOw0KICAgICAgaWYgKEJOX2NvbXAoUElOVF8g
cmVzdWx0LCBkaXYpID4gMCkgew0KCWlmIChqPT0xICYmIHZhbHVlID09IDAp
IGJyZWFrOyAvKiBkb24ndCBjb2xsZWN0IGxlYWRpbmcgMHMgKi8NCglCTl9z
ZXRkKHQyLCB2YWx1ZSwgai0xKTsNCgl0Mi0+ZGlnaXRzKys7DQoJdmFsdWUr
KzsNCglkaXZpZGVkID0gMTsNCglicmVhazsNCiAgICAgIH0NCiAgICB9DQog
ICAgaWYgKGRpdmlkZWQpIHsNCiAgICAgIEJOX3NldGQodDEsMCxqLTEpOw0K
ICAgICAgQk5fbXVsdGlwbHkoUElOVF8gcmVzdWx0LCB0MSwgdHdvLCBjb250
ZXh0KTsNCiAgICAgIEJOX2lzdWJ0cmFjdChQSU5UXyByZW0sIGRpdiwgcmVz
dWx0LCBjb250ZXh0KTsNCiAgICB9DQogICAgLyogQXJlIHdlIGRvbmUgeWV0
PyAqLw0KICAgIGlmICh2YWx1ZSAmJiByZW0tPmRpZ2l0cyA9PTEgJiYgQk5f
Z2V0ZChyZW0sIDApPT0wKSBicmVhazsNCiAgICBpZiAodDItPmRpZ2l0cyA9
PSBjb250ZXh0LT5wcmVjaXNpb24gKzEpIGJyZWFrOw0KICAgIGlmIChvcGVy
YXRpb24gPT0gQk5fRElWX0RJVklOVHx8IG9wZXJhdGlvbiA9PSBCTl9ESVZf
UkVNQUlOKSB7DQogICAgICBpZiAodDEtPmV4cG4gPT0wKSBicmVhazsNCiAg
ICB9DQogICAgQ0hFQ0tfT1ZFUkZMT1codDEtPmV4cG4sIDEsIEJOX0VYUE5f
TUFYLCAib3ZlcmZsb3cgaW4gZGl2aWRlIik7DQogICAgQ0hFQ0tfVU5ERVJG
TE9XKHQxLT5leHBuLCAtMSwgQk5fRVhQTl9NSU4sICJ1bmRlcmZsb3cgaW4g
ZGl2aWRlIik7DQogICAgdDEtPmV4cG4tLTsNCiAgICBpZiAoZGl2aWRlZCkg
Qk5fY29weShQSU5UXyBkaXYsIHJlbSk7DQogIH0NCg0KICAvKiBXb3JrIG91
dCB0aGUgc2lnbiBhbmQgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCAqLw0KICBm
b3IgKGk9MDsgaTwgdDItPmRpZ2l0czsgaSsrKSB7DQogICAgQk5fc2V0ZChy
ZXN1bHQsIGksIEJOX2dldGQodDIsIHQyLT5kaWdpdHMgLSAxIC1pKSk7DQog
IH0NCiAgaWYgKHQyLT5kaWdpdHMgPT0gMCkgew0KICAgIHJlc3VsdC0+ZGln
aXRzID0gMTsNCiAgICBCTl9zZXRkKHJlc3VsdCwgMCwgMCk7DQogICAgcmVz
dWx0LT5zaWduID0gMDsNCiAgfQ0KICBlbHNlIHsNCiAgICByZXN1bHQtPmRp
Z2l0cyA9IHQyLT5kaWdpdHM7DQogICAgcmVzdWx0LT5zaWduID0gMSYob25l
LT5zaWduIF4gczIpOw0KICAgIHJlc3VsdC0+ZXhwbiA9IHQxLT5leHBuOyAv
KiBXZSBrbm93IHRoaXMgaXMgZmluZSwgZnJvbSBhYm92ZSAqLw0KICB9DQog
IHR3by0+c2lnbiA9IHMyOw0KICByZW0tPnNpZ24gPSAxJihvbmUtPnNpZ24g
XiBzMik7DQoNCiAgQk5fZGVzdHJveShQSU5UXyB0MSk7DQogIEJOX2Rlc3Ry
b3koUElOVF8gdDIpOw0KICBCTl9kZXN0cm95KFBJTlRfIGRpdik7DQogIA0K
ICByZXR1cm47IC8qIHBoZXchICovDQp9DQoNCi8qIENvbXBhcmlzb24gd2l0
aCBubyByb3VuZGluZyBldGMuICovDQppbnQgQk5fY29tcCAoUElOVERfIEJJ
R05VTSAqb25lLCBCSUdOVU0gKnR3bykgew0KICBJTlRWQUwgaSxqOw0KICBp
bnQgY21wOw0KDQogIEJOX3N0cmlwX2xlYWRfemVyb3MoUElOVF8gb25lKTsN
CiAgQk5fc3RyaXBfbGVhZF96ZXJvcyhQSU5UXyB0d28pOw0KDQogIGlmIChv
bmUtPnNpZ24gIT0gdHdvLT5zaWduKSB7DQogICAgcmV0dXJuIG9uZS0+c2ln
biA/IDEgOiAtMTsNCiAgfQ0KICBlbHNlIGlmIChvbmUtPmV4cG4gKyBvbmUt
PmRpZ2l0cyA+IHR3by0+ZXhwbiArIHR3by0+ZGlnaXRzKSB7DQogICAgcmV0
dXJuIG9uZS0+c2lnbiA/IC0xIDogMTsNCiAgfQ0KICBlbHNlIGlmIChvbmUt
PmV4cG4gKyBvbmUtPmRpZ2l0cyA8IHR3by0+ZXhwbiArIHR3by0+ZGlnaXRz
KSB7DQogICAgcmV0dXJuIG9uZS0+c2lnbiA/IDEgOiAtMTsNCiAgfQ0KICBl
bHNlIHsgLyogU2FtZSBzaWduLCBzYW1lICJzaXplIiAqLw0KICAgIGZvciAo
aT0wOyBpPG9uZS0+ZGlnaXRzICYmIGk8dHdvLT5kaWdpdHM7IGkrKykgew0K
ICAgICAgY21wID0gQk5fZ2V0ZChvbmUsIG9uZS0+ZGlnaXRzLTEtaSkgLSBC
Tl9nZXRkKHR3bywgdHdvLT5kaWdpdHMtMS1pKTsNCiAgICAgIGlmIChjbXAp
IHJldHVybiBjbXA7DQogICAgfQ0KICAgIGlmICghY21wKSB7DQogICAgICBp
ZiAoaT09b25lLT5kaWdpdHMpIHsNCglmb3IgKGk9aTsgaTx0d28tPmRpZ2l0
czsgaSsrKSB7DQoJICBjbXAgPSAwLUJOX2dldGQodHdvLCB0d28tPmRpZ2l0
cy0xLWkpOw0KCSAgaWYgKGNtcCkgcmV0dXJuIGNtcDsNCgl9DQogICAgICB9
DQogICAgICBlbHNlIGlmIChpPT10d28tPmRpZ2l0cykgew0KCWZvciAoaT1p
OyBpPG9uZS0+ZGlnaXRzOyBpKyspIHsNCgkgIGNtcCA9IEJOX2dldGQob25l
LCBvbmUtPmRpZ2l0cy0xLWkpOw0KCSAgaWYgKGNtcCkgcmV0dXJuIGNtcDsN
Cgl9DQogICAgICB9DQogICAgICByZXR1cm4gY21wOw0KICAgIH0NCiAgfQ0K
fQ0KDQovKj1oZWFkMiBCTl9wb3dlcihyZXN1bHQsIGJpZ251bSwgZXhwbiwg
Y29udGV4dCkNCg0KQ2FsY3VsYXRlIHJlc3VsdCA9IGJpZ251bSAqKiBleHBu
Ow0KDQpYWFggVG8gRG8NCg0KPWN1dCovDQp2b2lkIEJOX3Bvd2VyKFBJTlRE
XyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNKiBiaWdudW0sDQogICAgICAgICAg
ICAgIEJJR05VTSogZXhwbiwgQk5fQ09OVEVYVCogY29udGV4dCkgew0KDQp9
DQoNCi8qPWhlYWQyIEJOX3Jlc2NhbGUocmVzdWx0LCBiaWdudW0sIGV4cG4s
IGNvbnRleHQpDQoNClJlc2NhbGVzIGJpZ251bSB0byBoYXZlIGFuIGV4cG9u
ZW50IG9mIGV4cG4uDQoNClhYWCBUbyBEbw0KDQo9Y3V0Ki8NCnZvaWQgQk5f
cmVzY2FsZShQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSogb25lLCBC
SUdOVU0qIHR3bywgQk5fQ09OVEVYVCogY29udGV4dCkgew0KICBJTlRWQUwg
ZXhwbjsNCiAgSU5UVkFMIGxvc3QgPSBjb250ZXh0LT5sb3N0X2RpZ2l0czsN
Cg0KICBCTl9hcml0aF9zZXR1cChQSU5UXyByZXN1bHQsIG9uZSwgdHdvLCBj
b250ZXh0KTsNCg0KICBjb250ZXh0LT5sb3N0X2RpZ2l0cyA9IDE7DQogIGV4
cG4gPSBCTl90b19pbnQoUElOVF8gdHdvLCBjb250ZXh0KTsNCiAgY29udGV4
dC0+bG9zdF9kaWdpdHMgPSBsb3N0Ow0KfQ0KDQovKj1oZWFkMiBJTlRWQUwg
Qk5fdG9faW50KEJJR05VTSogYmlnbnVtLCBCTl9DT05URVhUKiBjb250ZXh0
KQ0KDQpDb252ZXJ0cyB0aGUgYmlnbnVtIGludG8gYW4gaW50ZWdlciwgcmFp
c2VzIG92ZXJmbG93IGlmIGFuIGV4YWN0DQpyZXByZXNlbnRhdGlvbiBjYW5u
b3QgYmUgY3JlYXRlZC4NCg0KPWN1dCovDQpJTlRWQUwgQk5fdG9faW50KFBJ
TlRfIEJJR05VTSogYm4sIEJOX0NPTlRFWFQqIGNvbnRleHQpIHsNCiAgSU5U
VkFMIGluc2lnLCBpOw0KICBJTlRWQUwgcmVzdWx0ID0gMDsNCiAgSU5UVkFM
IG1heGRpZ3MgPSBCTl9EX1BFUl9JTlQgPCBjb250ZXh0LT5wcmVjaXNpb24g
Pw0KICAgICAgICAgICAgICAgICAgIEJOX0RfUEVSX0lOVCA6IGNvbnRleHQt
PnByZWNpc2lvbjsNCg0KDQogIEJOX3N0cmlwX2xlYWRfemVyb3MoUElOVF8g
Ym4pOw0KICAvKiBDaGVjayBmb3IgZGVmaW5pdGUgYmlnIGFzIHlvdXIgaGVh
ZCBvdmVyZmxvdyAqLw0KICBpZiAoYm4tPmV4cG4gPj0gMCAmJiBibi0+ZXhw
biArIGJuLT5kaWdpdHMgPiBCTl9EX1BFUl9JTlQpIHsNCiAgICBCTl9FWENF
UFQoUElOVF8gQk5fT1ZFUkZMT1csICJiaWdudW0gdG9vIGxhcmdlIHRvIGZp
dCBpbiBhbiBpbnQiKTsNCiAgfQ0KICBpZiAoYm4tPmV4cG4gPCAwICYmIGJu
LT5leHBuICsgYm4tPmRpZ2l0cyA+IEJOX0RfUEVSX0lOVCApIHsNCg0KICAg
IEJOX0VYQ0VQVChQSU5UXyBCTl9PVkVSRkxPVywgImJpZ251bSB0b28gbGFy
Z2UgdG8gZml0IGluIGFuIGludCIpOw0KICB9DQoNCiAgLyogaWYgZT4wLCBp
ZiB3ZSdsbCBsb3NlIHByZWNpc2lvbiB3ZSdsbCBhbHNvIGJlIHRvbyBiaWcs
IHNvIGxvc2UNCiAgICAgYWJvdmUgYW55d2F5LiAgT24gdGhlIG90aGVyIGhh
bmQsIHdpdGggZTwwLCB3ZSBjYW4gbG9zZSBkaWdpdHMgPA0KICAgICAuIGZy
b20gdGhpcyBzbyBuZWVkIHRvIGNoZWNrIHRoYXQgd2UgZG9uJ3QgbG9zZSBw
cmVjaXNpb24gKi8NCiAgaWYgKGJuLT5leHBuPDAgJiYgY29udGV4dC0+bG9z
dF9kaWdpdHMpIHsNCiAgICBCTl9FWENFUFQoUElOVF8gQk5fTE9TVF9ESUdJ
VFMsICJkaWdpdHMgbG9zdCBpbiBjb252IC0+IGludCIpOw0KICB9DQoNCiAg
aWYgKGJuLT5kaWdpdHMgKyBibi0+ZXhwbiA+IGNvbnRleHQtPnByZWNpc2lv
bikgew0KICAgIEJOX0VYQ0VQVChQSU5UXyBCTl9MT1NUX0RJR0lUUywgImRp
Z2l0cyBsb3N0IGluIGNvbnYgLT4gaW50Iik7DQogIH0NCg0KICAvKiBsdWNr
aWx5LCB3ZSBnZXQgdG8ga2VlcCBvdXIgZGlnaXRzLCBzbyBsZXQncyBnZXQg
YXQgJ2VtICovDQogIGlmIChibi0+ZXhwbiA+PSAwKSB7DQogICAgZm9yIChp
ID0gYm4tPmRpZ2l0cy0xOyBpPi0xOyBpLS0pIHsNCiAgICAgIHJlc3VsdCA9
IHJlc3VsdCAqIDEwICsgQk5fZ2V0ZChibiwgaSk7DQogICAgfQ0KICAgIGZv
ciAoaT0wOyBpPGJuLT5leHBuOyBpKyspIHJlc3VsdCA9IHJlc3VsdCAqIDEw
Ow0KICB9IA0KICBlbHNlIHsNCiAgICBmb3IgKGk9Ym4tPmRpZ2l0cy0xOyBp
Pi0xLWJuLT5leHBuOyBpLS0pIHsNCiAgICAgIHJlc3VsdCA9IHJlc3VsdCAq
IDEwICsgQk5fZ2V0ZChibiwgaSk7DQogICAgfQ0KICB9DQogIA0KICByZXR1
cm4gYm4tPnNpZ24gPyAtcmVzdWx0IDogcmVzdWx0Ow0KfQ0K
---556882451-1518492776-1013468550=:541
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="bignum.h"
Content-Transfer-Encoding: BASE64
Content-ID: <[email protected]>
Content-Description: bignum.h
Content-Disposition: attachment; filename="bignum.h"

LyogYmlnbnVtLmggLS0gSW5maW5pdGUgcHJlY2lzaW9uIGJjZCBmb3IgcGFy
cm90ICovDQoNCi8qIFN0dWZmIHRvIGJlIHBhcnJvdC1saWtlIGluIHNvdXJj
ZSwgZXZlbiBpZiBub3QgYmVpbmcgdXNlZCBpbiBwYXJyb3QgKi8NCiNpZmRl
ZiBQQVJST1RfSU5fQ09SRQ0KI2RlZmluZSBQSU5UXyBpbnRlcnByZXRlciwg
DQojZGVmaW5lIFBJTlREXyBJTlRFUlAqIGludGVycHJldGVyLA0KI2RlZmlu
ZSBCTl9hbGxvYyhpLCB4KSBtYWxsb2MoeCkNCiNkZWZpbmUgQk5fcmVhbGxv
YyhpLCB4LCB5KSByZWFsbG9jKHgsIHkpDQojZGVmaW5lIEJOX2ZyZWUoaSwg
eCkgZnJlZSh4KQ0KI2RlZmluZSBCTl9GQVRBTChpLCB4KSBibl9mYXRhbF9l
cnJvcih4KQ0KI2RlZmluZSBCTl9FWENFUFQoaSwgZXhjcCwgbWVzZykgQk5f
ZXhjZXB0aW9uKGksIGV4Y3AsIG1lc2cpDQojZWxzZSAvKiBOb3QgaW4gcGFy
cm90IGNvcmUgKi8NCnR5cGVkZWYgbG9uZyBJTlRWQUw7DQp0eXBlZGVmIHVu
c2lnbmVkIGxvbmcgVUlOVFZBTDsNCnR5cGVkZWYgZG91YmxlIEZMT0FUVkFM
Ow0KI2RlZmluZSBQSU5URF8NCiNkZWZpbmUgUElOVF8NCiNkZWZpbmUgQk5f
YWxsb2MoeCkgbWFsbG9jKHgpDQojZGVmaW5lIEJOX3JlYWxsb2MoeCwgeSkg
cmVhbGxvYyh4LCB5KQ0KI2RlZmluZSBCTl9mcmVlKHgpIGZyZWUoeCkNCiNk
ZWZpbmUgQk5fRkFUQUwoeCkgYm5fZmF0YWxfZXJyb3IoeCkNCiNkZWZpbmUg
Qk5fRVhDRVBUKGV4Y3AsIG1lc2cpIEJOX2V4Y2VwdGlvbihleGNwLCBtZXNn
KQ0KI2VuZGlmIC8qIGlmZGVmIFBBUlJPVF9JTl9DT1JFIGVsc2UgKi8NCg0K
LyogU3R1ZmYgY29uZmlndXJlIHNob3VsZCBkZXRlcm1pbmUqLw0KI2RlZmlu
ZSBCTl9EX1BFUl9OSUIgOCAgICAgICAvKiBkaWdpdHMgc3RvcmVkIGluIGEg
Qk5fTklCICovDQojZGVmaW5lIEJOX0RfUEVSX0lOVCAxMCAgICAgIC8qIERl
Y2ltYWwgZGlnaXRzIGluIGFuIElOVFZBTCAqLw0KI2RlZmluZSBCTl9EX1BF
Ul9GTE9BVCAzMiAgICAvKiBEZWNpbWFsIGRpZ2l0cyBpbiBhIEZMT0FUVkFM
ICovDQojZGVmaW5lIEJOX0VYUE5fTUFYIDEwMDAwICAgIC8qIG1heGltdW0g
dmFsdWUgb2YgZXhwbiovDQojZGVmaW5lIEJOX0VYUE5fTUlOIC0xMDAwMCAg
IC8qIG1pbmltdW0gdmFsdWUgb2YgZXhwbiAqLw0KI2RlZmluZSBCTl9NQVhf
RElHSVRTIDEwMDAwICAvKiBtYXggbnVtYmVyIG9mIGRpZ2l0cyBpbiBjb2Vm
ZiAqLw0KDQp0eXBlZGVmIFVJTlRWQUwgQk5fTklCOw0KDQovKiBCSUdOVU06
IDEyMzQ1Njc4OTAxMjM0eHh4eHh4eHh4eCAsIGV4cG4gPSAtNSwgc2lnbiA9
IDENCiAgICAgICAgICAgXiAgICAgICBeICAgICAgICBeICAgICAgDQogdmFs
dWUgPSAtMTIzNDU2Nzg5LjAxMjM0DQoNCiBidWZmZXIgcG9pbnRzIHRvIGZp
cnN0IGNhcmV0IChoZXJlIGFuIElOVFZBTCkNCiBuaWJzID09IDMsIGRpZ2l0
cyA9PSAxNA0KKi8NCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBCTl9OSUIqIGJ1
ZmZlcjsgIC8qIHN0cmluZyBvZiBuaWJibGVzICovDQogIFVJTlRWQUwgbmli
czsgICAgICAvKiBuaWJzIGFsbG9jYXRlZCAqLw0KICBJTlRWQUwgZGlnaXRz
OyAgICAvKiBkaWdpdHMgdXNlZCAqLw0KICBpbnQgc2lnbjsgICAgICAgICAv
KiBzaWduIG9mIG51bWJlciwgMD0+IHBvc2l0aXZlIG9yIHplcm8sIDEgPT4g
bmVnYXRpdmUgKi8NCiAgSU5UVkFMIGV4cG47ICAgICAgLyogZXhwb25lbnQg
b2YgbnVtYmVyICovDQp9IEJJR05VTTsNCg0KLyogQ09OVEVYVDogZGVmaW5l
cyB0aGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvbiwgcHJlY2lzaW9uIGFu
ZCByb3VuZGluZyAqLw0KDQp0eXBlZGVmIGVudW0gew0KICBST1VORF9IQUxG
X1VQLA0KICBST1VORF9ET1dOLA0KICBST1VORF9IQUxGX0VWRU4NCn0gQk5f
Uk9VTkRJTkc7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgSU5UVkFMIHByZWNp
c2lvbjsgICAgIC8qIG51bWJlciBvZiBkaWdpdHMgdG8gcmV0YWluICgtdmUg
Zm9yIG5vbmUpKi8NCiAgQk5fUk9VTkRJTkcgcm91bmRpbmc7IC8qIHJvdW5k
aW5nIHR5cGUgdG8gcGVyZm9ybSAqLw0KICBpbnQgbG9zdF9kaWdpdHM7ICAg
ICAgLyogMCA9PiByb3VuZCwgMSA9PiByYWlzZSBleGNlcHRpb24gKi8NCn0g
Qk5fQ09OVEVYVDsNCg0KLyogRXhjZXB0aW9uYWwgQ29uZGl0aW9ucyAqLw0K
DQp0eXBlZGVmIGVudW0gew0KICBCTl9DT05WRVJTSU9OX09WRVJGTE9XID0g
MTw8MCwNCiAgLyogQXNrZWQgdG8gaG9sZCBjb2VmZnxleHBuIHRvbyBsYXJn
ZSB2YWx1ZSAqLw0KICBCTl9DT05WRVJTSU9OX1NZTlRBWCA9IDE8PDEsDQog
IC8qIHN0cmluZyBub3QgY29uZm9ybWluZyB0byBudW1lcmljIGZvcm0gKi8N
CiAgQk5fQ09OVkVSU0lPTl9VTkRFUkZMT1cgPSAxPDwyLA0KICAvKiBleHBu
IG9mIHN0cmluZyB0b28gc21hbGwgdG8gYmUgaGVsZCAgKi8NCiAgQk5fRElW
SVNJT05fQllfWkVSTyA9IDE8PDMsDQogIC8qIGRpdmlkZW5kIG9mIGRpdi9k
aXYtaW50IG9yIHBvdyB6ZXJvICAqLw0KICBCTl9ESVZJU0lPTl9JTVBPU1NJ
QkxFID0gMTw8NCwNCiAgLyogaW50ZWdlciByZXN1bHQgb2YgZGl2LWludCBv
ciByZW0gPiBwcmVjaXNpb24gKi8NCiAgQk5fRElWSVNJT05fVU5ERUZJTkVE
ID0gMTw8NSwNCiAgLyogZGl2IGJ5IHplcm8gd2l0aCB6ZXJvIG9uIHRvcCBh
bHNvICovDQogIEJOX0lOU1VGRklDSUVOVF9TVE9SQUdFID0gMTw8NiwNCiAg
Lyogbm90IGVub3VnaCBzcGFjZSB0byBob2xkIGludGVybWVkaWF0ZSByZXN1
bHRzICovDQogIEJOX0lOVkFMSURfQ09OVEVYVCA9IDE8PDcsDQogIC8qIGNv
bnRleHQgZ2l2ZW4gd2FzIG5vdCB2YWxpZCAodW5rbm93biByb3VuZCkgKi8N
CiAgQk5fSU5WQUxJRF9PUEVSQVRJT04gPSAxPDw4LA0KICAvKiBvcGVyYXRp
b24gd2hpY2ggaXMgbm90IHZhbGlkICovDQogIEJOX0xPU1RfRElHSVRTID0g
MTw8OSwNCiAgLyogZGlnaXRzIGxvc3QgaW4gcm91bmRpbmcgICovDQogIEJO
X09WRVJGTE9XID0gMTw8MTAsDQogIC8qIGV4cG4gYmVjb21lcyBsYXJnZXIg
dGhhbiBtYXggYWxsb3dlZCAqLw0KICBCTl9VTkRFUkZMT1cgPSAxPDwxMQ0K
ICAvKiBleHBuIGJlY29tZXMgc21hbGxlciB0aGFuIG1pbiBhbGxvd2VkICov
DQp9IEJOX0VYQ0VQVElPTlM7DQoNCi8qQ2FwbicgQ3V0LW4tcGFzdGUgZnVu
Y3Rpb25zICovDQpCSUdOVU0qIEJOX25ldyhQSU5URF8gSU5UVkFMIGxlbmd0
aCk7DQppbnQgQk5fZ3JvdyhQSU5URF8gQklHTlVNICppbiwgSU5UVkFMIGxl
bmd0aCk7DQppbnQgQk5fZGVzdHJveShQSU5URF8gQklHTlVNICpibik7DQp2
b2lkIGJuX2ZhdGFsX2Vycm9yIChQSU5URF8gY2hhciogbWVzZyk7DQppbnQg
Qk5fc2V0X2RpZ2l0KFBJTlREXyBCSUdOVU0qIGJuLCBJTlRWQUwgcG9zLCBp
bnQgdmFsdWUpOw0KaW50IEJOX2dldF9kaWdpdChQSU5URF8gQklHTlVNKiBi
biwgSU5UVkFMIHBvcyk7DQpCSUdOVU0qIEJOX2NvcHkoUElOVERfIEJJR05V
TSosIEJJR05VTSopOw0KQklHTlVNKiBCTl9uZXdfZnJvbV9pbnQoUElOVERf
IElOVFZBTCB2YWx1ZSk7DQpJTlRWQUwgQk5fdG9fc2NpZW50aWZpY19zdHJp
bmcoUElOVERfIEJJR05VTSogYm4sIGNoYXIgKipkZXN0KTsNCklOVFZBTCBC
Tl90b19lbmdpbmVlcmluZ19zdHJpbmcoUElOVERfIEJJR05VTSpibiwgY2hh
ciAqKmRlc3QpOw0KaW50IEJOX3JvdW5kIChQSU5URF8gQklHTlVNICp2aWN0
aW0sIEJOX0NPTlRFWFQqIGNvbnRleHQpOw0Kdm9pZCBCTl9FWENFUFQoUElO
VERfIEJOX0VYQ0VQVElPTlMsIGNoYXIqKTsNCnZvaWQgQk5fYWRkKFBJTlRE
XyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdvLCBC
Tl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQNCkJOX3N1YnRyYWN0KFBJTlRE
XyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNICpvbmUsIEJJR05VTSAqdHdvLCBC
Tl9DT05URVhUICpjb250ZXh0KTsNCnZvaWQgQk5fcGx1cyhQSU5URF8gQklH
TlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBCTl9DT05URVhUICpjb250ZXh0
KTsNCnZvaWQgQk5fbWludXMoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdO
VU0gKm9uZSwgQk5fQ09OVEVYVCAqY29udGV4dCk7DQp2b2lkIA0KQk5fY29t
cGFyZSAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0gKm9uZSwgQklH
TlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpOw0Kdm9pZCANCkJOX211
bHRpcGx5IChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
SUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCk7DQp2b2lkIA0KQk5f
ZGl2aWRlIChQSU5URF8gQklHTlVNKiByZXN1bHQsIEJJR05VTSAqb25lLCBC
SUdOVU0gKnR3bywgQk5fQ09OVEVYVCAqY29udGV4dCk7DQp2b2lkDQpCTl9k
aXZpZGVfaW50ZWdlciAoUElOVERfIEJJR05VTSogcmVzdWx0LCBCSUdOVU0g
Km9uZSwgQklHTlVNICp0d28sIEJOX0NPTlRFWFQgKmNvbnRleHQpOw0Kdm9p
ZCBCTl9yZXNjYWxlKFBJTlREXyBCSUdOVU0qIHJlc3VsdCwgQklHTlVNKiBi
aWdudW0sIEJJR05VTSogZXhwbiwgQk5fQ09OVEVYVCogY29udGV4dCk7DQpJ
TlRWQUwgQk5fdG9faW50KFBJTlREXyBCSUdOVU0qIGJpZ251bSwgQk5fQ09O
VEVYVCogY29udGV4dCk7DQp2b2lkIEJOX3Bvd2VyKFBJTlREXyBCSUdOVU0q
IHJlc3VsdCwgQklHTlVNKiBiaWdudW0sDQogICAgICAgICAgICAgIEJJR05V
TSogZXhwbiwgQk5fQ09OVEVYVCogY29udGV4dCk7DQo=
---556882451-1518492776-1013468550=:541--