RE: Less talk
[email protected] (Tels) Mon, 11 Feb 2002 00:21:27 +0100 (CET)
| Newsgroups | perl.perl6.internals.bignum |
|---|---|
| Organization | none |
| Message-ID | <[email protected]> |
--_=XFMail.1.4.0.Linux:020211002047:666=_ Content-Type: text/plain; charset=iso-8859-1 -----BEGIN PGP SIGNED MESSAGE----- Moin, On 11-Feb-02 Alex Gough tried to scribble about: > 5) I'd like very much to be able to back-port this into perl5 as it > lacks a decimal arithmetic library, What's wrong with Math::BigInt as a "decimal arithmetic library"? Cheers, Tels - -- perl -MDev::Bollocks -e'print Dev::Bollocks->rand(),"\n"' professionally expedite dynamic e-business http://bloodgate.com/perl My current Perl projects PGP key available on http://bloodgate.com/tels.asc or via email -----BEGIN PGP SIGNATURE----- Version: 2.6.3i Charset: latin1 iQEVAwUBPGcAT3cLPEOTuEwVAQGqtgf/VPLFnTudg+c3PIy/OCVIAdBKhLTn3sDo xRZaxhF586HsAaqdPfnOz66eE4exOBoo7FtQkiz9s6MLgsvntKl3Qfq1oYvjCwWt uOfgNJ7LUmFI6T1NK6U99Bkm+DlKGHGXh7i0aDpAl45mM7C74JHyAN8ONKDI3ril pRWPELF9Wp9VryDqWmHIPIup5ngt5sQ06RZWUJG6EPU3jJuj5yEBk13VcJ4vPNYu gd/W65KYwGJNpcZPL1xjulimbqdtFb8vH8FIg5jzcG6pw/zpO+JSviJzmyZaMYw6 tFDlloY3VqWv6/sc/O99XLLaF42OOvLztc790kV8cXjcVwnPKY2Ysg== =JjU3 -----END PGP SIGNATURE----- --_=XFMail.1.4.0.Linux:020211002047:666=_ 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 --_=XFMail.1.4.0.Linux:020211002047:666=_ 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= --_=XFMail.1.4.0.Linux:020211002047:666=_-- End of MIME message