From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32319 invoked by alias); 24 Nov 2007 02:34:26 -0000 Received: (qmail 32262 invoked by uid 22791); 24 Nov 2007 02:34:05 -0000 X-Spam-Check-By: sourceware.org Received: from rv-out-0910.google.com (HELO rv-out-0910.google.com) (209.85.198.187) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 24 Nov 2007 02:33:30 +0000 Received: by rv-out-0910.google.com with SMTP id f5so2572668rvb for ; Fri, 23 Nov 2007 18:33:27 -0800 (PST) Received: by 10.140.136.6 with SMTP id j6mr3681rvd.1195871607603; Fri, 23 Nov 2007 18:33:27 -0800 (PST) Received: by 10.141.19.8 with HTTP; Fri, 23 Nov 2007 18:33:27 -0800 (PST) Message-ID: <6c33472e0711231833m46b9c70u75e99fd37e0b3852@mail.gmail.com> Date: Sat, 24 Nov 2007 11:28:00 -0000 From: "=?ISO-8859-1?Q?Manuel_L=F3pez-Ib=E1=F1ez?=" To: "GCC Patches" Subject: simplify conversion_warning Cc: "Joseph S. Myers" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_22193_3060233.1195871607556" X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2007-11/txt/msg01274.txt.bz2 ------=_Part_22193_3060233.1195871607556 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 989 :ADDPATCH: The fix for PR c++/34198 used get_narrowed. By using get_unwidened the code is much simpler and easier to understand. Jakub mentions this alternative here: http://gcc.gnu.org/ml/gcc-patches/2007-11/msg01227.html > But get_narrower has the advantage of getting through multiple > conversions of the same precision, in case we decide e.g. to > further optimize away the warning for BIT_AND_EXPR where > one of the operands is INTEGER_CST mask which fits into > type. I don't see this as much as an advantage at the present moment since we are not looking inside expressions (and it seems unlikely that we will do it in the near future). And if we do it, all that code (including the narrowing magic) would be better in a separate function. So I think it is better to keep the code as simpler as possible. Bootstrapped and regression tested. 2007-11-24 Manuel Lopez-Ibanez * c-common.c (conversion_warning): Use get_unwidened instead of get_narrower. ------=_Part_22193_3060233.1195871607556 Content-Type: text/x-csrc; name=c-common.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_f9dj07gs Content-Disposition: attachment; filename=c-common.c Content-length: 314460 LyogU3Vicm91dGluZXMgc2hhcmVkIGJ5IGFsbCBsYW5ndWFnZXMgdGhhdCBh cmUgdmFyaWFudHMgb2YgQy4KICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkz LCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAog ICAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKVGhpcyBmaWxlIGlzIHBh cnQgb2YgR0NDLgoKR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKdmVyc2lv bi4KCkdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJ VFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmZvciBtb3JlIGRldGFp bHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIEdDQzsgc2Vl IHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQo8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoj aW5jbHVkZSAic3lzdGVtLmgiCiNpbmNsdWRlICJjb3JldHlwZXMuaCIKI2lu Y2x1ZGUgInRtLmgiCiNpbmNsdWRlICJpbnRsLmgiCiNpbmNsdWRlICJ0cmVl LmgiCiNpbmNsdWRlICJmbGFncy5oIgojaW5jbHVkZSAib3V0cHV0LmgiCiNp bmNsdWRlICJjLXByYWdtYS5oIgojaW5jbHVkZSAicnRsLmgiCiNpbmNsdWRl ICJnZ2MuaCIKI2luY2x1ZGUgInZhcnJheS5oIgojaW5jbHVkZSAiZXhwci5o IgojaW5jbHVkZSAiYy1jb21tb24uaCIKI2luY2x1ZGUgImRpYWdub3N0aWMu aCIKI2luY2x1ZGUgInRtX3AuaCIKI2luY2x1ZGUgIm9ic3RhY2suaCIKI2lu Y2x1ZGUgImNwcGxpYi5oIgojaW5jbHVkZSAidGFyZ2V0LmgiCiNpbmNsdWRl ICJsYW5naG9va3MuaCIKI2luY2x1ZGUgInRyZWUtaW5saW5lLmgiCiNpbmNs dWRlICJjLXRyZWUuaCIKI2luY2x1ZGUgInRvcGxldi5oIgojaW5jbHVkZSAi dHJlZS1pdGVyYXRvci5oIgojaW5jbHVkZSAiaGFzaHRhYi5oIgojaW5jbHVk ZSAidHJlZS1tdWRmbGFwLmgiCiNpbmNsdWRlICJvcHRzLmgiCiNpbmNsdWRl ICJyZWFsLmgiCiNpbmNsdWRlICJjZ3JhcGguaCIKI2luY2x1ZGUgInRhcmdl dC1kZWYuaCIKI2luY2x1ZGUgImZpeGVkLXZhbHVlLmgiCgpjcHBfcmVhZGVy ICpwYXJzZV9pbjsJCS8qIERlY2xhcmVkIGluIGMtcHJhZ21hLmguICAqLwoK LyogV2UgbGV0IHRtLmggb3ZlcnJpZGUgdGhlIHR5cGVzIHVzZWQgaGVyZSwg dG8gaGFuZGxlIHRyaXZpYWwgZGlmZmVyZW5jZXMKICAgc3VjaCBhcyB0aGUg Y2hvaWNlIG9mIHVuc2lnbmVkIGludCBvciBsb25nIHVuc2lnbmVkIGludCBm b3Igc2l6ZV90LgogICBXaGVuIG1hY2hpbmVzIHN0YXJ0IG5lZWRpbmcgbm9u dHJpdmlhbCBkaWZmZXJlbmNlcyBpbiB0aGUgc2l6ZSB0eXBlLAogICBpdCB3 b3VsZCBiZSBiZXN0IHRvIGRvIHNvbWV0aGluZyBoZXJlIHRvIGZpZ3VyZSBv dXQgYXV0b21hdGljYWxseQogICBmcm9tIG90aGVyIGluZm9ybWF0aW9uIHdo YXQgdHlwZSB0byB1c2UuICAqLwoKI2lmbmRlZiBTSVpFX1RZUEUKI2RlZmlu ZSBTSVpFX1RZUEUgImxvbmcgdW5zaWduZWQgaW50IgojZW5kaWYKCiNpZm5k ZWYgUElEX1RZUEUKI2RlZmluZSBQSURfVFlQRSAiaW50IgojZW5kaWYKCiNp Zm5kZWYgV0NIQVJfVFlQRQojZGVmaW5lIFdDSEFSX1RZUEUgImludCIKI2Vu ZGlmCgovKiBXQ0hBUl9UWVBFIGdldHMgb3ZlcnJpZGRlbiBieSAtZnNob3J0 LXdjaGFyLiAgKi8KI2RlZmluZSBNT0RJRklFRF9XQ0hBUl9UWVBFIFwKCShm bGFnX3Nob3J0X3djaGFyID8gInNob3J0IHVuc2lnbmVkIGludCIgOiBXQ0hB Ul9UWVBFKQoKI2lmbmRlZiBQVFJESUZGX1RZUEUKI2RlZmluZSBQVFJESUZG X1RZUEUgImxvbmcgaW50IgojZW5kaWYKCiNpZm5kZWYgV0lOVF9UWVBFCiNk ZWZpbmUgV0lOVF9UWVBFICJ1bnNpZ25lZCBpbnQiCiNlbmRpZgoKI2lmbmRl ZiBJTlRNQVhfVFlQRQojZGVmaW5lIElOVE1BWF9UWVBFICgoSU5UX1RZUEVf U0laRSA9PSBMT05HX0xPTkdfVFlQRV9TSVpFKQlcCgkJICAgICA/ICJpbnQi CQkJCQlcCgkJICAgICA6ICgoTE9OR19UWVBFX1NJWkUgPT0gTE9OR19MT05H X1RZUEVfU0laRSkJXAoJCQk/ICJsb25nIGludCIJCQkJXAoJCQk6ICJsb25n IGxvbmcgaW50IikpCiNlbmRpZgoKI2lmbmRlZiBVSU5UTUFYX1RZUEUKI2Rl ZmluZSBVSU5UTUFYX1RZUEUgKChJTlRfVFlQRV9TSVpFID09IExPTkdfTE9O R19UWVBFX1NJWkUpCVwKCQkgICAgID8gInVuc2lnbmVkIGludCIJCQkJXAoJ CSAgICAgOiAoKExPTkdfVFlQRV9TSVpFID09IExPTkdfTE9OR19UWVBFX1NJ WkUpCVwKCQkJPyAibG9uZyB1bnNpZ25lZCBpbnQiCQkJXAoJCQk6ICJsb25n IGxvbmcgdW5zaWduZWQgaW50IikpCiNlbmRpZgoKLyogVGhlIGZvbGxvd2lu ZyBzeW1ib2xzIGFyZSBzdWJzdW1lZCBpbiB0aGUgY19nbG9iYWxfdHJlZXMg YXJyYXksIGFuZAogICBsaXN0ZWQgaGVyZSBpbmRpdmlkdWFsbHkgZm9yIGRv Y3VtZW50YXRpb24gcHVycG9zZXMuCgogICBJTlRFR0VSX1RZUEUgYW5kIFJF QUxfVFlQRSBub2RlcyBmb3IgdGhlIHN0YW5kYXJkIGRhdGEgdHlwZXMuCgoJ dHJlZSBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZTsKCXRyZWUgbG9uZ19pbnRl Z2VyX3R5cGVfbm9kZTsKCXRyZWUgbG9uZ19sb25nX2ludGVnZXJfdHlwZV9u b2RlOwoKCXRyZWUgc2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlOwoJdHJlZSBs b25nX3Vuc2lnbmVkX3R5cGVfbm9kZTsKCXRyZWUgbG9uZ19sb25nX3Vuc2ln bmVkX3R5cGVfbm9kZTsKCgl0cmVlIHRydXRodmFsdWVfdHlwZV9ub2RlOwoJ dHJlZSB0cnV0aHZhbHVlX2ZhbHNlX25vZGU7Cgl0cmVlIHRydXRodmFsdWVf dHJ1ZV9ub2RlOwoKCXRyZWUgcHRyZGlmZl90eXBlX25vZGU7CgoJdHJlZSB1 bnNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKCXRyZWUgc2lnbmVkX2NoYXJfdHlw ZV9ub2RlOwoJdHJlZSB3Y2hhcl90eXBlX25vZGU7Cgl0cmVlIHNpZ25lZF93 Y2hhcl90eXBlX25vZGU7Cgl0cmVlIHVuc2lnbmVkX3djaGFyX3R5cGVfbm9k ZTsKCgl0cmVlIGZsb2F0X3R5cGVfbm9kZTsKCXRyZWUgZG91YmxlX3R5cGVf bm9kZTsKCXRyZWUgbG9uZ19kb3VibGVfdHlwZV9ub2RlOwoKCXRyZWUgY29t cGxleF9pbnRlZ2VyX3R5cGVfbm9kZTsKCXRyZWUgY29tcGxleF9mbG9hdF90 eXBlX25vZGU7Cgl0cmVlIGNvbXBsZXhfZG91YmxlX3R5cGVfbm9kZTsKCXRy ZWUgY29tcGxleF9sb25nX2RvdWJsZV90eXBlX25vZGU7CgoJdHJlZSBkZmxv YXQzMl90eXBlX25vZGU7Cgl0cmVlIGRmbG9hdDY0X3R5cGVfbm9kZTsKCXRy ZWVfZGZsb2F0MTI4X3R5cGVfbm9kZTsKCgl0cmVlIGludFFJX3R5cGVfbm9k ZTsKCXRyZWUgaW50SElfdHlwZV9ub2RlOwoJdHJlZSBpbnRTSV90eXBlX25v ZGU7Cgl0cmVlIGludERJX3R5cGVfbm9kZTsKCXRyZWUgaW50VElfdHlwZV9u b2RlOwoKCXRyZWUgdW5zaWduZWRfaW50UUlfdHlwZV9ub2RlOwoJdHJlZSB1 bnNpZ25lZF9pbnRISV90eXBlX25vZGU7Cgl0cmVlIHVuc2lnbmVkX2ludFNJ X3R5cGVfbm9kZTsKCXRyZWUgdW5zaWduZWRfaW50RElfdHlwZV9ub2RlOwoJ dHJlZSB1bnNpZ25lZF9pbnRUSV90eXBlX25vZGU7CgoJdHJlZSB3aWRlc3Rf aW50ZWdlcl9saXRlcmFsX3R5cGVfbm9kZTsKCXRyZWUgd2lkZXN0X3Vuc2ln bmVkX2xpdGVyYWxfdHlwZV9ub2RlOwoKICAgTm9kZXMgZm9yIHR5cGVzIGB2 b2lkIConIGFuZCBgY29uc3Qgdm9pZCAqJy4KCgl0cmVlIHB0cl90eXBlX25v ZGUsIGNvbnN0X3B0cl90eXBlX25vZGU7CgogICBOb2RlcyBmb3IgdHlwZXMg YGNoYXIgKicgYW5kIGBjb25zdCBjaGFyIConLgoKCXRyZWUgc3RyaW5nX3R5 cGVfbm9kZSwgY29uc3Rfc3RyaW5nX3R5cGVfbm9kZTsKCiAgIFR5cGUgYGNo YXJbU09NRU5VTUJFUl0nLgogICBVc2VkIHdoZW4gYW4gYXJyYXkgb2YgY2hh ciBpcyBuZWVkZWQgYW5kIHRoZSBzaXplIGlzIGlycmVsZXZhbnQuCgoJdHJl ZSBjaGFyX2FycmF5X3R5cGVfbm9kZTsKCiAgIFR5cGUgYGludFtTT01FTlVN QkVSXScgb3Igc29tZXRoaW5nIGxpa2UgaXQuCiAgIFVzZWQgd2hlbiBhbiBh cnJheSBvZiBpbnQgbmVlZGVkIGFuZCB0aGUgc2l6ZSBpcyBpcnJlbGV2YW50 LgoKCXRyZWUgaW50X2FycmF5X3R5cGVfbm9kZTsKCiAgIFR5cGUgYHdjaGFy X3RbU09NRU5VTUJFUl0nIG9yIHNvbWV0aGluZyBsaWtlIGl0LgogICBVc2Vk IHdoZW4gYSB3aWRlIHN0cmluZyBsaXRlcmFsIGlzIGNyZWF0ZWQuCgoJdHJl ZSB3Y2hhcl9hcnJheV90eXBlX25vZGU7CgogICBUeXBlIGBpbnQgKCknIC0t IHVzZWQgZm9yIGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9ucy4K Cgl0cmVlIGRlZmF1bHRfZnVuY3Rpb25fdHlwZTsKCiAgIEEgVk9JRF9UWVBF IG5vZGUsIHBhY2thZ2VkIGluIGEgVFJFRV9MSVNULgoKCXRyZWUgdm9pZF9s aXN0X25vZGU7CgogIFRoZSBsYXppbHkgY3JlYXRlZCBWQVJfREVDTHMgZm9y IF9fRlVOQ1RJT05fXywgX19QUkVUVFlfRlVOQ1RJT05fXywKICBhbmQgX19m dW5jX18uIChDIGRvZXNuJ3QgZ2VuZXJhdGUgX19GVU5DVElPTl9fIGFuZF9f UFJFVFRZX0ZVTkNUSU9OX18KICBWQVJfREVDTFMsIGJ1dCBDKysgZG9lcy4p CgoJdHJlZSBmdW5jdGlvbl9uYW1lX2RlY2xfbm9kZTsKCXRyZWUgcHJldHR5 X2Z1bmN0aW9uX25hbWVfZGVjbF9ub2RlOwoJdHJlZSBjOTlfZnVuY3Rpb25f bmFtZV9kZWNsX25vZGU7CgogIFN0YWNrIG9mIG5lc3RlZCBmdW5jdGlvbiBu YW1lIFZBUl9ERUNMcy4KCgl0cmVlIHNhdmVkX2Z1bmN0aW9uX25hbWVfZGVj bHM7CgoqLwoKdHJlZSBjX2dsb2JhbF90cmVlc1tDVElfTUFYXTsKDAovKiBT d2l0Y2hlcyBjb21tb24gdG8gdGhlIEMgZnJvbnQgZW5kcy4gICovCgovKiBO b256ZXJvIGlmIHByZXByZXByb2Nlc3Npbmcgb25seS4gICovCgppbnQgZmxh Z19wcmVwcm9jZXNzX29ubHk7CgovKiBOb256ZXJvIG1lYW5zIGRvbid0IG91 dHB1dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCgpjaGFyIGZsYWdf bm9fbGluZV9jb21tYW5kczsKCi8qIE5vbnplcm8gY2F1c2VzIC1FIG91dHB1 dCBub3QgdG8gYmUgZG9uZSwgYnV0IGRpcmVjdGl2ZXMgc3VjaCBhcwogICAj ZGVmaW5lIHRoYXQgaGF2ZSBzaWRlIGVmZmVjdHMgYXJlIHN0aWxsIG9iZXll ZC4gICovCgpjaGFyIGZsYWdfbm9fb3V0cHV0OwoKLyogTm9uemVybyBtZWFu cyBkdW1wIG1hY3JvcyBpbiBzb21lIGZhc2hpb24uICAqLwoKY2hhciBmbGFn X2R1bXBfbWFjcm9zOwoKLyogTm9uemVybyBtZWFucyBwYXNzICNpbmNsdWRl IGxpbmVzIHRocm91Z2ggdG8gdGhlIG91dHB1dC4gICovCgpjaGFyIGZsYWdf ZHVtcF9pbmNsdWRlczsKCi8qIE5vbnplcm8gbWVhbnMgcHJvY2VzcyBQQ0gg ZmlsZXMgd2hpbGUgcHJlcHJvY2Vzc2luZy4gICovCgpib29sIGZsYWdfcGNo X3ByZXByb2Nlc3M7CgovKiBUaGUgZmlsZSBuYW1lIHRvIHdoaWNoIHdlIHNo b3VsZCB3cml0ZSBhIHByZWNvbXBpbGVkIGhlYWRlciwgb3IKICAgTlVMTCBp ZiBubyBoZWFkZXIgd2lsbCBiZSB3cml0dGVuIGluIHRoaXMgY29tcGlsZS4g ICovCgpjb25zdCBjaGFyICpwY2hfZmlsZTsKCi8qIE5vbnplcm8gaWYgYW4g SVNPIHN0YW5kYXJkIHdhcyBzZWxlY3RlZC4gIEl0IHJlamVjdHMgbWFjcm9z IGluIHRoZQogICB1c2VyJ3MgbmFtZXNwYWNlLiAgKi8KaW50IGZsYWdfaXNv OwoKLyogTm9uemVybyBpZiAtdW5kZWYgd2FzIGdpdmVuLiAgSXQgc3VwcHJl c3NlcyB0YXJnZXQgYnVpbHQtaW4gbWFjcm9zCiAgIGFuZCBhc3NlcnRpb25z LiAgKi8KaW50IGZsYWdfdW5kZWY7CgovKiBOb256ZXJvIG1lYW5zIGRvbid0 IHJlY29nbml6ZSB0aGUgbm9uLUFOU0kgYnVpbHRpbiBmdW5jdGlvbnMuICAq LwoKaW50IGZsYWdfbm9fYnVpbHRpbjsKCi8qIE5vbnplcm8gbWVhbnMgZG9u J3QgcmVjb2duaXplIHRoZSBub24tQU5TSSBidWlsdGluIGZ1bmN0aW9ucy4K ICAgLWFuc2kgc2V0cyB0aGlzLiAgKi8KCmludCBmbGFnX25vX25vbmFuc2lf YnVpbHRpbjsKCi8qIE5vbnplcm8gbWVhbnMgZ2l2ZSBgZG91YmxlJyB0aGUg c2FtZSBzaXplIGFzIGBmbG9hdCcuICAqLwoKaW50IGZsYWdfc2hvcnRfZG91 YmxlOwoKLyogTm9uemVybyBtZWFucyBnaXZlIGB3Y2hhcl90JyB0aGUgc2Ft ZSBzaXplIGFzIGBzaG9ydCcuICAqLwoKaW50IGZsYWdfc2hvcnRfd2NoYXI7 CgovKiBOb256ZXJvIG1lYW5zIGFsbG93IGltcGxpY2l0IGNvbnZlcnNpb25z IGJldHdlZW4gdmVjdG9ycyB3aXRoCiAgIGRpZmZlcmluZyBudW1iZXJzIG9m IHN1YnBhcnRzIGFuZC9vciBkaWZmZXJpbmcgZWxlbWVudCB0eXBlcy4gICov CmludCBmbGFnX2xheF92ZWN0b3JfY29udmVyc2lvbnM7CgovKiBOb256ZXJv IG1lYW5zIGFsbG93IE1pY3Jvc29mdCBleHRlbnNpb25zIHdpdGhvdXQgd2Fy bmluZ3Mgb3IgZXJyb3JzLiAgKi8KaW50IGZsYWdfbXNfZXh0ZW5zaW9uczsK Ci8qIE5vbnplcm8gbWVhbnMgZG9uJ3QgcmVjb2duaXplIHRoZSBrZXl3b3Jk IGBhc20nLiAgKi8KCmludCBmbGFnX25vX2FzbTsKCi8qIE5vbnplcm8gbWVh bnMgdG8gdHJlYXQgYml0ZmllbGRzIGFzIHNpZ25lZCB1bmxlc3MgdGhleSBz YXkgYHVuc2lnbmVkJy4gICovCgppbnQgZmxhZ19zaWduZWRfYml0ZmllbGRz ID0gMTsKCi8qIFdhcm4gYWJvdXQgI3ByYWdtYSBkaXJlY3RpdmVzIHRoYXQg YXJlIG5vdCByZWNvZ25pemVkLiAgKi8KCmludCB3YXJuX3Vua25vd25fcHJh Z21hczsgLyogVHJpIHN0YXRlIHZhcmlhYmxlLiAgKi8KCi8qIFdhcm4gYWJv dXQgZm9ybWF0L2FyZ3VtZW50IGFub21hbGllcyBpbiBjYWxscyB0byBmb3Jt YXR0ZWQgSS9PIGZ1bmN0aW9ucwogICAoKnByaW50ZiwgKnNjYW5mLCBzdHJm dGltZSwgc3RyZm1vbiwgZXRjLikuICAqLwoKaW50IHdhcm5fZm9ybWF0OwoK LyogV2FybiBhYm91dCB1c2luZyBfX251bGwgKGFzIE5VTEwgaW4gQysrKSBh cyBzZW50aW5lbC4gIEZvciBjb2RlIGNvbXBpbGVkCiAgIHdpdGggR0NDIHRo aXMgZG9lc24ndCBtYXR0ZXIgYXMgX19udWxsIGlzIGd1YXJhbnRlZWQgdG8g aGF2ZSB0aGUgcmlnaHQKICAgc2l6ZS4gICovCgppbnQgd2Fybl9zdHJpY3Rf bnVsbF9zZW50aW5lbDsKCi8qIFplcm8gbWVhbnMgdGhhdCBmYXN0ZXIsIC4u Lk5vbk5pbCB2YXJpYW50cyBvZiBvYmpjX21zZ1NlbmQuLi4KICAgY2FsbHMg d2lsbCBiZSB1c2VkIGluIE9iakM7IHBhc3NpbmcgbmlsIHJlY2VpdmVycyB0 byBzdWNoIGNhbGxzCiAgIHdpbGwgbW9zdCBsaWtlbHkgcmVzdWx0IGluIGNy YXNoZXMuICAqLwppbnQgZmxhZ19uaWxfcmVjZWl2ZXJzID0gMTsKCi8qIE5v bnplcm8gbWVhbnMgdGhhdCBjb2RlIGdlbmVyYXRpb24gd2lsbCBiZSBhbHRl cmVkIHRvIHN1cHBvcnQKICAgInplcm8tbGluayIgZXhlY3V0aW9uLiAgVGhp cyBjdXJyZW50bHkgYWZmZWN0cyBPYmpDIG9ubHksIGJ1dCBtYXkKICAgYWZm ZWN0IG90aGVyIGxhbmd1YWdlcyBpbiB0aGUgZnV0dXJlLiAgKi8KaW50IGZs YWdfemVyb19saW5rID0gMDsKCi8qIE5vbnplcm8gbWVhbnMgZW1pdCBhbiAn X19PQkpDLCBfX2ltYWdlX2luZm8nIGZvciB0aGUgY3VycmVudCB0cmFuc2xh dGlvbgogICB1bml0LiAgSXQgd2lsbCBpbmZvcm0gdGhlIE9iakMgcnVudGlt ZSB0aGF0IGNsYXNzIGRlZmluaXRpb24ocykgaGVyZWluCiAgIGNvbnRhaW5l ZCBhcmUgdG8gcmVwbGFjZSBvbmUocykgcHJldmlvdXNseSBsb2FkZWQuICAq LwppbnQgZmxhZ19yZXBsYWNlX29iamNfY2xhc3NlcyA9IDA7CgovKiBDL09i akMgbGFuZ3VhZ2Ugb3B0aW9uIHZhcmlhYmxlcy4gICovCgoKLyogTm9uemVy byBtZWFucyBhbGxvdyB0eXBlIG1pc21hdGNoZXMgaW4gY29uZGl0aW9uYWwg ZXhwcmVzc2lvbnM7CiAgIGp1c3QgbWFrZSB0aGVpciB2YWx1ZXMgYHZvaWQn LiAgKi8KCmludCBmbGFnX2NvbmRfbWlzbWF0Y2g7CgovKiBOb256ZXJvIG1l YW5zIGVuYWJsZSBDODkgQW1lbmRtZW50IDEgZmVhdHVyZXMuICAqLwoKaW50 IGZsYWdfaXNvYzk0OwoKLyogTm9uemVybyBtZWFucyB1c2UgdGhlIElTTyBD OTkgZGlhbGVjdCBvZiBDLiAgKi8KCmludCBmbGFnX2lzb2M5OTsKCi8qIE5v bnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGJ1aWx0aW4gZnVuY3Rpb25zLCBh bmQgbWFpbiBpcyBhbiBpbnQuICAqLwoKaW50IGZsYWdfaG9zdGVkID0gMTsK Ci8qIFdhcm4gaWYgbWFpbiBpcyBzdXNwaWNpb3VzLiAgKi8KCmludCB3YXJu X21haW47CgoKLyogT2JqQyBsYW5ndWFnZSBvcHRpb24gdmFyaWFibGVzLiAg Ki8KCgovKiBPcGVuIGFuZCBjbG9zZSB0aGUgZmlsZSBmb3Igb3V0cHV0dGlu ZyBjbGFzcyBkZWNsYXJhdGlvbnMsIGlmCiAgIHJlcXVlc3RlZCAoT2JqQyku ICAqLwoKaW50IGZsYWdfZ2VuX2RlY2xhcmF0aW9uOwoKLyogVGVsbHMgdGhl IGNvbXBpbGVyIHRoYXQgdGhpcyBpcyBhIHNwZWNpYWwgcnVuLiAgRG8gbm90 IHBlcmZvcm0gYW55CiAgIGNvbXBpbGluZywgaW5zdGVhZCB3ZSBhcmUgdG8g dGVzdCBzb21lIHBsYXRmb3JtIGRlcGVuZGVudCBmZWF0dXJlcwogICBhbmQg b3V0cHV0IGEgQyBoZWFkZXIgZmlsZSB3aXRoIGFwcHJvcHJpYXRlIGRlZmlu aXRpb25zLiAgKi8KCmludCBwcmludF9zdHJ1Y3RfdmFsdWVzOwoKLyogVGVs bHMgdGhlIGNvbXBpbGVyIHdoYXQgaXMgdGhlIGNvbnN0YW50IHN0cmluZyBj bGFzcyBmb3IgT2JqYy4gICovCgpjb25zdCBjaGFyICpjb25zdGFudF9zdHJp bmdfY2xhc3NfbmFtZTsKCgovKiBDKysgbGFuZ3VhZ2Ugb3B0aW9uIHZhcmlh Ymxlcy4gICovCgoKLyogTm9uemVybyBtZWFucyBkb24ndCByZWNvZ25pemUg YW55IGV4dGVuc2lvbiBrZXl3b3Jkcy4gICovCgppbnQgZmxhZ19ub19nbnVf a2V5d29yZHM7CgovKiBOb256ZXJvIG1lYW5zIGRvIGVtaXQgZXhwb3J0ZWQg aW1wbGVtZW50YXRpb25zIG9mIGZ1bmN0aW9ucyBldmVuIGlmCiAgIHRoZXkg Y2FuIGJlIGlubGluZWQuICAqLwoKaW50IGZsYWdfaW1wbGVtZW50X2lubGlu ZXMgPSAxOwoKLyogTm9uemVybyBtZWFucyB0aGF0IGltcGxpY2l0IGluc3Rh bnRpYXRpb25zIHdpbGwgYmUgZW1pdHRlZCBpZiBuZWVkZWQuICAqLwoKaW50 IGZsYWdfaW1wbGljaXRfdGVtcGxhdGVzID0gMTsKCi8qIE5vbnplcm8gbWVh bnMgdGhhdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBvZiBpbmxpbmUgdGVt cGxhdGVzIHdpbGwgYmUKICAgZW1pdHRlZCBpZiBuZWVkZWQsIGV2ZW4gaWYg aW5zdGFudGlhdGlvbnMgb2Ygbm9uLWlubGluZSB0ZW1wbGF0ZXMKICAgYXJl bid0LiAgKi8KCmludCBmbGFnX2ltcGxpY2l0X2lubGluZV90ZW1wbGF0ZXMg PSAxOwoKLyogTm9uemVybyBtZWFucyBnZW5lcmF0ZSBzZXBhcmF0ZSBpbnN0 YW50aWF0aW9uIGNvbnRyb2wgZmlsZXMgYW5kCiAgIGp1Z2dsZSB0aGVtIGF0 IGxpbmsgdGltZS4gICovCgppbnQgZmxhZ191c2VfcmVwb3NpdG9yeTsKCi8q IE5vbnplcm8gaWYgd2Ugd2FudCB0byBpc3N1ZSBkaWFnbm9zdGljcyB0aGF0 IHRoZSBzdGFuZGFyZCBzYXlzIGFyZSBub3QKICAgcmVxdWlyZWQuICAqLwoK aW50IGZsYWdfb3B0aW9uYWxfZGlhZ3MgPSAxOwoKLyogTm9uemVybyBtZWFu cyB3ZSBzaG91bGQgYXR0ZW1wdCB0byBlbGlkZSBjb25zdHJ1Y3RvcnMgd2hl biBwb3NzaWJsZS4gICovCgppbnQgZmxhZ19lbGlkZV9jb25zdHJ1Y3RvcnMg PSAxOwoKLyogTm9uemVybyBtZWFucyB0aGF0IG1lbWJlciBmdW5jdGlvbnMg ZGVmaW5lZCBpbiBjbGFzcyBzY29wZSBhcmUKICAgaW5saW5lIGJ5IGRlZmF1 bHQuICAqLwoKaW50IGZsYWdfZGVmYXVsdF9pbmxpbmUgPSAxOwoKLyogQ29u dHJvbHMgd2hldGhlciBjb21waWxlciBnZW5lcmF0ZXMgJ3R5cGUgZGVzY3Jp cHRvcicgdGhhdCBnaXZlCiAgIHJ1bi10aW1lIHR5cGUgaW5mb3JtYXRpb24u ICAqLwoKaW50IGZsYWdfcnR0aSA9IDE7CgovKiBOb256ZXJvIGlmIHdlIHdh bnQgdG8gY29uc2VydmUgc3BhY2UgaW4gdGhlIC5vIGZpbGVzLiAgV2UgZG8g dGhpcwogICBieSBwdXR0aW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSBhbmQgcnVu dGltZSBpbml0aWFsaXplZCBkYXRhIGludG8KICAgLmNvbW1vbiBpbnN0ZWFk IG9mIC5kYXRhIGF0IHRoZSBleHBlbnNlIG9mIG5vdCBmbGFnZ2luZyBtdWx0 aXBsZQogICBkZWZpbml0aW9ucy4gICovCgppbnQgZmxhZ19jb25zZXJ2ZV9z cGFjZTsKCi8qIE5vbnplcm8gaWYgd2Ugd2FudCB0byBvYmV5IGFjY2VzcyBj b250cm9sIHNlbWFudGljcy4gICovCgppbnQgZmxhZ19hY2Nlc3NfY29udHJv bCA9IDE7CgovKiBOb256ZXJvIGlmIHdlIHdhbnQgdG8gY2hlY2sgdGhlIHJl dHVybiB2YWx1ZSBvZiBuZXcgYW5kIGF2b2lkIGNhbGxpbmcKICAgY29uc3Ry dWN0b3JzIGlmIGl0IGlzIGEgbnVsbCBwb2ludGVyLiAgKi8KCmludCBmbGFn X2NoZWNrX25ldzsKCi8qIFRoZSBDKysgZGlhbGVjdCBiZWluZyB1c2VkLiBD Kys5OCBpcyB0aGUgZGVmYXVsdC4gICovCgplbnVtIGN4eF9kaWFsZWN0IGN4 eF9kaWFsZWN0ID0gY3h4OTg7CgovKiBOb256ZXJvIGlmIHdlIHdhbnQgdGhl IG5ldyBJU08gcnVsZXMgZm9yIHB1c2hpbmcgYSBuZXcgc2NvcGUgZm9yIGBm b3InCiAgIGluaXRpYWxpemF0aW9uIHZhcmlhYmxlcy4KICAgMDogT2xkIHJ1 bGVzLCBzZXQgYnkgLWZuby1mb3Itc2NvcGUuCiAgIDI6IE5ldyBJU08gcnVs ZXMsIHNldCBieSAtZmZvci1zY29wZS4KICAgMTogVHJ5IHRvIGltcGxlbWVu dCBuZXcgSVNPIHJ1bGVzLCBidXQgd2l0aCBiYWNrdXAgY29tcGF0aWJpbGl0 eQogICAoYW5kIHdhcm5pbmdzKS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGZv ciBub3cuICAqLwoKaW50IGZsYWdfbmV3X2Zvcl9zY29wZSA9IDE7CgovKiBO b256ZXJvIGlmIHdlIHdhbnQgdG8gZW1pdCBkZWZpbmVkIHN5bWJvbHMgd2l0 aCBjb21tb24tbGlrZSBsaW5rYWdlIGFzCiAgIHdlYWsgc3ltYm9scyB3aGVy ZSBwb3NzaWJsZSwgaW4gb3JkZXIgdG8gY29uZm9ybSB0byBDKysgc2VtYW50 aWNzLgogICBPdGhlcndpc2UsIGVtaXQgdGhlbSBhcyBsb2NhbCBzeW1ib2xz LiAgKi8KCmludCBmbGFnX3dlYWsgPSAxOwoKLyogMCBtZWFucyB3ZSB3YW50 IHRoZSBwcmVwcm9jZXNzb3IgdG8gbm90IGVtaXQgbGluZSBkaXJlY3RpdmVz IGZvcgogICB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIDEgbWVh bnMgd2Ugd2FudCBpdCB0byBkbyBpdC4gIC0xCiAgIG1lYW5zIHdlIHNob3Vs ZCBkZWNpZGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgZGVidWdnaW5nIGluZm9y bWF0aW9uCiAgIGlzIGJlaW5nIGVtaXR0ZWQgb3Igbm90LiAgKi8KCmludCBm bGFnX3dvcmtpbmdfZGlyZWN0b3J5ID0gLTE7CgovKiBOb256ZXJvIHRvIHVz ZSBfX2N4YV9hdGV4aXQsIHJhdGhlciB0aGFuIGF0ZXhpdCwgdG8gcmVnaXN0 ZXIKICAgZGVzdHJ1Y3RvcnMgZm9yIGxvY2FsIHN0YXRpY3MgYW5kIGdsb2Jh bCBvYmplY3RzLiAgJzInIG1lYW5zIGl0IGhhcyBiZWVuCiAgIHNldCBub256 ZXJvIGFzIGEgZGVmYXVsdCwgbm90IGJ5IGEgY29tbWFuZC1saW5lIGZsYWcu ICAqLwoKaW50IGZsYWdfdXNlX2N4YV9hdGV4aXQgPSBERUZBVUxUX1VTRV9D WEFfQVRFWElUOwoKLyogTm9uemVybyB0byB1c2UgX19jeGFfZ2V0X2V4Y2Vw dGlvbl9wdHIgaW4gQysrIGV4Y2VwdGlvbi1oYW5kbGluZwogICBjb2RlLiAg JzInIG1lYW5zIGl0IGhhcyBub3QgYmVlbiBzZXQgZXhwbGljaXRseSBvbiB0 aGUgY29tbWFuZCBsaW5lLiAgKi8KCmludCBmbGFnX3VzZV9jeGFfZ2V0X2V4 Y2VwdGlvbl9wdHIgPSAyOwoKLyogTm9uemVybyBtZWFucyBtYWtlIHRoZSBk ZWZhdWx0IHBlZHdhcm5zIHdhcm5pbmdzIGluc3RlYWQgb2YgZXJyb3JzLgog ICBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGlzIGlnbm9yZWQgaWYgLXBlZGFu dGljIGlzIHNwZWNpZmllZC4gICovCgppbnQgZmxhZ19wZXJtaXNzaXZlOwoK LyogTm9uemVybyBtZWFucyB0byBpbXBsZW1lbnQgc3RhbmRhcmQgc2VtYW50 aWNzIGZvciBleGNlcHRpb24KICAgc3BlY2lmaWNhdGlvbnMsIGNhbGxpbmcg dW5leHBlY3RlZCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIHRoYXQKICAg ZG9lc24ndCBtYXRjaCB0aGUgc3BlY2lmaWNhdGlvbi4gIFplcm8gbWVhbnMg dG8gdHJlYXQgdGhlbSBhcwogICBhc3NlcnRpb25zIGFuZCBvcHRpbWl6ZSBh Y2NvcmRpbmdseSwgYnV0IG5vdCBjaGVjayB0aGVtLiAgKi8KCmludCBmbGFn X2VuZm9yY2VfZWhfc3BlY3MgPSAxOwoKLyogTm9uemVybyBtZWFucyB0byBn ZW5lcmF0ZSB0aHJlYWQtc2FmZSBjb2RlIGZvciBpbml0aWFsaXppbmcgbG9j YWwKICAgc3RhdGljcy4gICovCgppbnQgZmxhZ190aHJlYWRzYWZlX3N0YXRp Y3MgPSAxOwoKLyogTm9uemVybyBtZWFucyB3YXJuIGFib3V0IGltcGxpY2l0 IGRlY2xhcmF0aW9ucy4gICovCgppbnQgd2Fybl9pbXBsaWNpdCA9IDE7Cgov KiBNYXhpbXVtIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGguICBUaGlz IGxpbWl0IGlzIHJhdGhlcgogICBhcmJpdHJhcnksIGJ1dCBpdCBleGlzdHMg dG8gbGltaXQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gbm90aWNlCiAgIGluZmlu aXRlIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLiAgKi8KCmludCBtYXhfdGlu c3RfZGVwdGggPSA1MDA7CgoKCi8qIFRoZSBlbGVtZW50cyBvZiBgcmlkcG9p bnRlcnMnIGFyZSBpZGVudGlmaWVyIG5vZGVzIGZvciB0aGUgcmVzZXJ2ZWQK ICAgdHlwZSBuYW1lcyBhbmQgc3RvcmFnZSBjbGFzc2VzLiAgSXQgaXMgaW5k ZXhlZCBieSBhIFJJRF8uLi4gdmFsdWUuICAqLwp0cmVlICpyaWRwb2ludGVy czsKCnRyZWUgKCptYWtlX2ZuYW1lX2RlY2wpICh0cmVlLCBpbnQpOwoKLyog Tm9uemVybyBtZWFucyB0aGUgZXhwcmVzc2lvbiBiZWluZyBwYXJzZWQgd2ls bCBuZXZlciBiZSBldmFsdWF0ZWQuCiAgIFRoaXMgaXMgYSBjb3VudCwgc2lu Y2UgdW5ldmFsdWF0ZWQgZXhwcmVzc2lvbnMgY2FuIG5lc3QuICAqLwppbnQg c2tpcF9ldmFsdWF0aW9uOwoKLyogSW5mb3JtYXRpb24gYWJvdXQgaG93IGEg ZnVuY3Rpb24gbmFtZSBpcyBnZW5lcmF0ZWQuICAqLwpzdHJ1Y3QgZm5hbWVf dmFyX3QKewogIHRyZWUgKmNvbnN0IGRlY2w7CS8qIHBvaW50ZXIgdG8gdGhl IFZBUl9ERUNMLiAgKi8KICBjb25zdCB1bnNpZ25lZCByaWQ7CS8qIFJJRCBu dW1iZXIgZm9yIHRoZSBpZGVudGlmaWVyLiAgKi8KICBjb25zdCBpbnQgcHJl dHR5OwkvKiBIb3cgcHJldHR5IGlzIGl0PyAqLwp9OwoKLyogVGhlIHRocmVl IHdheXMgb2YgZ2V0dGluZyB0aGVuIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnVu Y3Rpb24uICAqLwoKY29uc3Qgc3RydWN0IGZuYW1lX3Zhcl90IGZuYW1lX3Zh cnNbXSA9CnsKICAvKiBDOTkgY29tcGxpYW50IF9fZnVuY19fLCBtdXN0IGJl IGZpcnN0LiAgKi8KICB7JmM5OV9mdW5jdGlvbl9uYW1lX2RlY2xfbm9kZSwg UklEX0M5OV9GVU5DVElPTl9OQU1FLCAwfSwKICAvKiBHQ0MgX19GVU5DVElP Tl9fIGNvbXBsaWFudC4gICovCiAgeyZmdW5jdGlvbl9uYW1lX2RlY2xfbm9k ZSwgUklEX0ZVTkNUSU9OX05BTUUsIDB9LAogIC8qIEdDQyBfX1BSRVRUWV9G VU5DVElPTl9fIGNvbXBsaWFudC4gICovCiAgeyZwcmV0dHlfZnVuY3Rpb25f bmFtZV9kZWNsX25vZGUsIFJJRF9QUkVUVFlfRlVOQ1RJT05fTkFNRSwgMX0s CiAge05VTEwsIDAsIDB9LAp9OwoKc3RhdGljIHRyZWUgY2hlY2tfY2FzZV92 YWx1ZSAodHJlZSk7CnN0YXRpYyBib29sIGNoZWNrX2Nhc2VfYm91bmRzICh0 cmVlLCB0cmVlLCB0cmVlICosIHRyZWUgKik7CgpzdGF0aWMgdHJlZSBoYW5k bGVfcGFja2VkX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQs IGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub2NvbW1vbl9hdHRyaWJ1 dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMg dHJlZSBoYW5kbGVfY29tbW9uX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0 cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub3JldHVy bl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICop OwpzdGF0aWMgdHJlZSBoYW5kbGVfaG90X2F0dHJpYnV0ZSAodHJlZSAqLCB0 cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9j b2xkX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wg Kik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub2lubGluZV9hdHRyaWJ1dGUgKHRy ZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBo YW5kbGVfYWx3YXlzX2lubGluZV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwg dHJlZSwgaW50LAoJCQkJCSAgICBib29sICopOwpzdGF0aWMgdHJlZSBoYW5k bGVfZ251X2lubGluZV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwg aW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfYXJ0aWZpY2lhbF9h dHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpz dGF0aWMgdHJlZSBoYW5kbGVfZmxhdHRlbl9hdHRyaWJ1dGUgKHRyZWUgKiwg dHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVf ZXJyb3JfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9v bCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX3VzZWRfYXR0cmlidXRlICh0cmVl ICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFu ZGxlX3VudXNlZF9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50 LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfZXh0ZXJuYWxseV92aXNp YmxlX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsCgkJCQkJ CSBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfY29uc3RfYXR0cmlidXRl ICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRy ZWUgaGFuZGxlX3RyYW5zcGFyZW50X3VuaW9uX2F0dHJpYnV0ZSAodHJlZSAq LCB0cmVlLCB0cmVlLAoJCQkJCQlpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVl IGhhbmRsZV9jb25zdHJ1Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwg dHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfZGVzdHJ1 Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29s ICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfbW9kZV9hdHRyaWJ1dGUgKHRyZWUg KiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5k bGVfc2VjdGlvbl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50 LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfYWxpZ25lZF9hdHRyaWJ1 dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMg dHJlZSBoYW5kbGVfd2Vha19hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJl ZSwgaW50LCBib29sICopIDsKc3RhdGljIHRyZWUgaGFuZGxlX2FsaWFzX2F0 dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0 YXRpYyB0cmVlIGhhbmRsZV93ZWFrcmVmX2F0dHJpYnV0ZSAodHJlZSAqLCB0 cmVlLCB0cmVlLCBpbnQsIGJvb2wgKikgOwpzdGF0aWMgdHJlZSBoYW5kbGVf dmlzaWJpbGl0eV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50 LAoJCQkJCSBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfdGxzX21vZGVs X2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsCgkJCQkJYm9v bCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX25vX2luc3RydW1lbnRfZnVuY3Rp b25fYXR0cmlidXRlICh0cmVlICosIHRyZWUsCgkJCQkJCSAgICAgdHJlZSwg aW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfbWFsbG9jX2F0dHJp YnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRp YyB0cmVlIGhhbmRsZV9yZXR1cm5zX3R3aWNlX2F0dHJpYnV0ZSAodHJlZSAq LCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRs ZV9ub19saW1pdF9zdGFja19hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJl ZSwgaW50LAoJCQkJCSAgICAgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxl X3B1cmVfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9v bCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX25vdm9wc19hdHRyaWJ1dGUgKHRy ZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBo YW5kbGVfZGVwcmVjYXRlZF9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJl ZSwgaW50LAoJCQkJCSBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfdmVj dG9yX3NpemVfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwK CQkJCQkgIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub25udWxsX2F0 dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0 YXRpYyB0cmVlIGhhbmRsZV9ub3Rocm93X2F0dHJpYnV0ZSAodHJlZSAqLCB0 cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9j bGVhbnVwX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJv b2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV93YXJuX3VudXNlZF9yZXN1bHRf YXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwKCQkJCQkJIGJv b2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9zZW50aW5lbF9hdHRyaWJ1dGUg KHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJl ZSBoYW5kbGVfdHlwZV9nZW5lcmljX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVl LCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9hbGxv Y19zaXplX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJv b2wgKik7CgpzdGF0aWMgdm9pZCBjaGVja19mdW5jdGlvbl9ub25udWxsICh0 cmVlLCBpbnQsIHRyZWUgKik7CnN0YXRpYyB2b2lkIGNoZWNrX25vbm51bGxf YXJnICh2b2lkICosIHRyZWUsIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpOwpz dGF0aWMgYm9vbCBub25udWxsX2NoZWNrX3AgKHRyZWUsIHVuc2lnbmVkIEhP U1RfV0lERV9JTlQpOwpzdGF0aWMgYm9vbCBnZXRfbm9ubnVsbF9vcGVyYW5k ICh0cmVlLCB1bnNpZ25lZCBIT1NUX1dJREVfSU5UICopOwpzdGF0aWMgaW50 IHJlc29ydF9maWVsZF9kZWNsX2NtcCAoY29uc3Qgdm9pZCAqLCBjb25zdCB2 b2lkICopOwoKLyogVGFibGUgb2YgbWFjaGluZS1pbmRlcGVuZGVudCBhdHRy aWJ1dGVzIGNvbW1vbiB0byBhbGwgQy1saWtlIGxhbmd1YWdlcy4gICovCmNv bnN0IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYyBjX2NvbW1vbl9hdHRyaWJ1dGVf dGFibGVbXSA9CnsKICAvKiB7IG5hbWUsIG1pbl9sZW4sIG1heF9sZW4sIGRl Y2xfcmVxLCB0eXBlX3JlcSwgZm5fdHlwZV9yZXEsIGhhbmRsZXIgfSAqLwog IHsgInBhY2tlZCIsICAgICAgICAgICAgICAgICAwLCAwLCBmYWxzZSwgZmFs c2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfcGFja2VkX2F0dHJpYnV0ZSB9 LAogIHsgIm5vY29tbW9uIiwgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAg ZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfbm9jb21tb25fYXR0cmli dXRlIH0sCiAgeyAiY29tbW9uIiwgICAgICAgICAgICAgICAgIDAsIDAsIHRy dWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9jb21tb25fYXR0 cmlidXRlIH0sCiAgLyogRklYTUU6IGxvZ2ljYWxseSwgbm9yZXR1cm4gYXR0 cmlidXRlcyBzaG91bGQgYmUgbGlzdGVkIGFzCiAgICAgImZhbHNlLCB0cnVl LCB0cnVlIiBhbmQgYXBwbHkgdG8gZnVuY3Rpb24gdHlwZXMuICBCdXQgaW1w bGVtZW50aW5nIHRoaXMKICAgICB3b3VsZCByZXF1aXJlIGFsbCB0aGUgcGxh Y2VzIGluIHRoZSBjb21waWxlciB0aGF0IHVzZSBUUkVFX1RISVNfVk9MQVRJ TEUKICAgICBvbiBhIGRlY2wgdG8gaWRlbnRpZnkgbm9uLXJldHVybmluZyBm dW5jdGlvbnMgdG8gYmUgbG9jYXRlZCBhbmQgZml4ZWQKICAgICB0byBjaGVj ayB0aGUgZnVuY3Rpb24gdHlwZSBpbnN0ZWFkLiAgKi8KICB7ICJub3JldHVy biIsICAgICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwK CQkJICAgICAgaGFuZGxlX25vcmV0dXJuX2F0dHJpYnV0ZSB9LAogIHsgInZv bGF0aWxlIiwgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZh bHNlLAoJCQkgICAgICBoYW5kbGVfbm9yZXR1cm5fYXR0cmlidXRlIH0sCiAg eyAibm9pbmxpbmUiLCAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxz ZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9ub2lubGluZV9hdHRyaWJ1dGUg fSwKICB7ICJhbHdheXNfaW5saW5lIiwgICAgICAgICAgMCwgMCwgdHJ1ZSwg IGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX2Fsd2F5c19pbmxpbmVf YXR0cmlidXRlIH0sCiAgeyAiZ251X2lubGluZSIsICAgICAgICAgICAgIDAs IDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9nbnVf aW5saW5lX2F0dHJpYnV0ZSB9LAogIHsgImFydGlmaWNpYWwiLCAgICAgICAg ICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5k bGVfYXJ0aWZpY2lhbF9hdHRyaWJ1dGUgfSwKICB7ICJmbGF0dGVuIiwgICAg ICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAg ICAgaGFuZGxlX2ZsYXR0ZW5fYXR0cmlidXRlIH0sCiAgeyAidXNlZCIsICAg ICAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJ CSAgICAgIGhhbmRsZV91c2VkX2F0dHJpYnV0ZSB9LAogIHsgInVudXNlZCIs ICAgICAgICAgICAgICAgICAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAoJ CQkgICAgICBoYW5kbGVfdW51c2VkX2F0dHJpYnV0ZSB9LAogIHsgImV4dGVy bmFsbHlfdmlzaWJsZSIsICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNl LAoJCQkgICAgICBoYW5kbGVfZXh0ZXJuYWxseV92aXNpYmxlX2F0dHJpYnV0 ZSB9LAogIC8qIFRoZSBzYW1lIGNvbW1lbnRzIGFzIGZvciBub3JldHVybiBh dHRyaWJ1dGVzIGFwcGx5IHRvIGNvbnN0IG9uZXMuICAqLwogIHsgImNvbnN0 IiwgICAgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNl LAoJCQkgICAgICBoYW5kbGVfY29uc3RfYXR0cmlidXRlIH0sCiAgeyAidHJh bnNwYXJlbnRfdW5pb24iLCAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFs c2UsCgkJCSAgICAgIGhhbmRsZV90cmFuc3BhcmVudF91bmlvbl9hdHRyaWJ1 dGUgfSwKICB7ICJjb25zdHJ1Y3RvciIsICAgICAgICAgICAgMCwgMSwgdHJ1 ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX2NvbnN0cnVjdG9y X2F0dHJpYnV0ZSB9LAogIHsgImRlc3RydWN0b3IiLCAgICAgICAgICAgICAw LCAxLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfZGVz dHJ1Y3Rvcl9hdHRyaWJ1dGUgfSwKICB7ICJtb2RlIiwgICAgICAgICAgICAg ICAgICAgMSwgMSwgZmFsc2UsICB0cnVlLCBmYWxzZSwKCQkJICAgICAgaGFu ZGxlX21vZGVfYXR0cmlidXRlIH0sCiAgeyAic2VjdGlvbiIsICAgICAgICAg ICAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhh bmRsZV9zZWN0aW9uX2F0dHJpYnV0ZSB9LAogIHsgImFsaWduZWQiLCAgICAg ICAgICAgICAgICAwLCAxLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAoJCQkgICAg ICBoYW5kbGVfYWxpZ25lZF9hdHRyaWJ1dGUgfSwKICB7ICJ3ZWFrIiwgICAg ICAgICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJ ICAgICAgaGFuZGxlX3dlYWtfYXR0cmlidXRlIH0sCiAgeyAiYWxpYXMiLCAg ICAgICAgICAgICAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJ CSAgICAgIGhhbmRsZV9hbGlhc19hdHRyaWJ1dGUgfSwKICB7ICJ3ZWFrcmVm IiwgICAgICAgICAgICAgICAgMCwgMSwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwK CQkJICAgICAgaGFuZGxlX3dlYWtyZWZfYXR0cmlidXRlIH0sCiAgeyAibm9f aW5zdHJ1bWVudF9mdW5jdGlvbiIsIDAsIDAsIHRydWUsICBmYWxzZSwgZmFs c2UsCgkJCSAgICAgIGhhbmRsZV9ub19pbnN0cnVtZW50X2Z1bmN0aW9uX2F0 dHJpYnV0ZSB9LAogIHsgIm1hbGxvYyIsICAgICAgICAgICAgICAgICAwLCAw LCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfbWFsbG9j X2F0dHJpYnV0ZSB9LAogIHsgInJldHVybnNfdHdpY2UiLCAgICAgICAgICAw LCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfcmV0 dXJuc190d2ljZV9hdHRyaWJ1dGUgfSwKICB7ICJub19zdGFja19saW1pdCIs ICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAg aGFuZGxlX25vX2xpbWl0X3N0YWNrX2F0dHJpYnV0ZSB9LAogIHsgInB1cmUi LCAgICAgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNl LAoJCQkgICAgICBoYW5kbGVfcHVyZV9hdHRyaWJ1dGUgfSwKICAvKiBGb3Ig aW50ZXJuYWwgdXNlIChtYXJraW5nIG9mIGJ1aWx0aW5zKSBvbmx5LiAgVGhl IG5hbWUgY29udGFpbnMgc3BhY2UKICAgICB0byBwcmV2ZW50IGl0cyB1c2Fn ZSBpbiBzb3VyY2UgY29kZS4gICovCiAgeyAibm8gdm9wcyIsICAgICAgICAg ICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhh bmRsZV9ub3ZvcHNfYXR0cmlidXRlIH0sCiAgeyAiZGVwcmVjYXRlZCIsICAg ICAgICAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCgkJCSAgICAg IGhhbmRsZV9kZXByZWNhdGVkX2F0dHJpYnV0ZSB9LAogIHsgInZlY3Rvcl9z aXplIiwJICAgICAgMSwgMSwgZmFsc2UsIHRydWUsIGZhbHNlLAoJCQkgICAg ICBoYW5kbGVfdmVjdG9yX3NpemVfYXR0cmlidXRlIH0sCiAgeyAidmlzaWJp bGl0eSIsCSAgICAgIDEsIDEsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCgkJCSAg ICAgIGhhbmRsZV92aXNpYmlsaXR5X2F0dHJpYnV0ZSB9LAogIHsgInRsc19t b2RlbCIsCSAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAg ICAgIGhhbmRsZV90bHNfbW9kZWxfYXR0cmlidXRlIH0sCiAgeyAibm9ubnVs bCIsICAgICAgICAgICAgICAgIDAsIC0xLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwK CQkJICAgICAgaGFuZGxlX25vbm51bGxfYXR0cmlidXRlIH0sCiAgeyAibm90 aHJvdyIsICAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFs c2UsCgkJCSAgICAgIGhhbmRsZV9ub3Rocm93X2F0dHJpYnV0ZSB9LAogIHsg Im1heV9hbGlhcyIsCSAgICAgIDAsIDAsIGZhbHNlLCB0cnVlLCBmYWxzZSwg TlVMTCB9LAogIHsgImNsZWFudXAiLAkJICAgICAgMSwgMSwgdHJ1ZSwgZmFs c2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfY2xlYW51cF9hdHRyaWJ1dGUg fSwKICB7ICJ3YXJuX3VudXNlZF9yZXN1bHQiLCAgICAgMCwgMCwgZmFsc2Us IHRydWUsIHRydWUsCgkJCSAgICAgIGhhbmRsZV93YXJuX3VudXNlZF9yZXN1 bHRfYXR0cmlidXRlIH0sCiAgeyAic2VudGluZWwiLCAgICAgICAgICAgICAg IDAsIDEsIGZhbHNlLCB0cnVlLCB0cnVlLAoJCQkgICAgICBoYW5kbGVfc2Vu dGluZWxfYXR0cmlidXRlIH0sCiAgLyogRm9yIGludGVybmFsIHVzZSAobWFy a2luZyBvZiBidWlsdGlucykgb25seS4gIFRoZSBuYW1lIGNvbnRhaW5zIHNw YWNlCiAgICAgdG8gcHJldmVudCBpdHMgdXNhZ2UgaW4gc291cmNlIGNvZGUu ICAqLwogIHsgInR5cGUgZ2VuZXJpYyIsICAgICAgICAgICAwLCAwLCBmYWxz ZSwgdHJ1ZSwgdHJ1ZSwKCQkJICAgICAgaGFuZGxlX3R5cGVfZ2VuZXJpY19h dHRyaWJ1dGUgfSwKICB7ICJhbGxvY19zaXplIiwJICAgICAgMSwgMiwgZmFs c2UsIHRydWUsIHRydWUsCgkJCSAgICAgIGhhbmRsZV9hbGxvY19zaXplX2F0 dHJpYnV0ZSB9LAogIHsgImNvbGQiLCAgICAgICAgICAgICAgICAgICAwLCAw LCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfY29sZF9h dHRyaWJ1dGUgfSwKICB7ICJob3QiLCAgICAgICAgICAgICAgICAgICAgMCwg MCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX2hvdF9h dHRyaWJ1dGUgfSwKICB7ICJ3YXJuaW5nIiwJCSAgICAgIDEsIDEsIHRydWUs ICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9lcnJvcl9hdHRyaWJ1 dGUgfSwKICB7ICJlcnJvciIsCQkgICAgICAxLCAxLCB0cnVlLCAgZmFsc2Us IGZhbHNlLAoJCQkgICAgICBoYW5kbGVfZXJyb3JfYXR0cmlidXRlIH0sCiAg eyBOVUxMLCAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGZhbHNlLCBmYWxz ZSwgZmFsc2UsIE5VTEwgfQp9OwoKLyogR2l2ZSB0aGUgc3BlY2lmaWNhdGlv bnMgZm9yIHRoZSBmb3JtYXQgYXR0cmlidXRlcywgdXNlZCBieSBDIGFuZCBh bGwKICAgZGVzY2VuZGFudHMuICAqLwoKY29uc3Qgc3RydWN0IGF0dHJpYnV0 ZV9zcGVjIGNfY29tbW9uX2Zvcm1hdF9hdHRyaWJ1dGVfdGFibGVbXSA9CnsK ICAvKiB7IG5hbWUsIG1pbl9sZW4sIG1heF9sZW4sIGRlY2xfcmVxLCB0eXBl X3JlcSwgZm5fdHlwZV9yZXEsIGhhbmRsZXIgfSAqLwogIHsgImZvcm1hdCIs ICAgICAgICAgICAgICAgICAzLCAzLCBmYWxzZSwgdHJ1ZSwgIHRydWUsCgkJ CSAgICAgIGhhbmRsZV9mb3JtYXRfYXR0cmlidXRlIH0sCiAgeyAiZm9ybWF0 X2FyZyIsICAgICAgICAgICAgIDEsIDEsIGZhbHNlLCB0cnVlLCAgdHJ1ZSwK CQkJICAgICAgaGFuZGxlX2Zvcm1hdF9hcmdfYXR0cmlidXRlIH0sCiAgeyBO VUxMLCAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwg ZmFsc2UsIE5VTEwgfQp9OwoKLyogUHVzaCBjdXJyZW50IGJpbmRpbmdzIGZv ciB0aGUgZnVuY3Rpb24gbmFtZSBWQVJfREVDTFMuICAqLwoKdm9pZApzdGFy dF9mbmFtZV9kZWNscyAodm9pZCkKewogIHVuc2lnbmVkIGl4OwogIHRyZWUg c2F2ZWQgPSBOVUxMX1RSRUU7CgogIGZvciAoaXggPSAwOyBmbmFtZV92YXJz W2l4XS5kZWNsOyBpeCsrKQogICAgewogICAgICB0cmVlIGRlY2wgPSAqZm5h bWVfdmFyc1tpeF0uZGVjbDsKCiAgICAgIGlmIChkZWNsKQoJewoJICBzYXZl ZCA9IHRyZWVfY29ucyAoZGVjbCwgYnVpbGRfaW50X2NzdCAoTlVMTF9UUkVF LCBpeCksIHNhdmVkKTsKCSAgKmZuYW1lX3ZhcnNbaXhdLmRlY2wgPSBOVUxM X1RSRUU7Cgl9CiAgICB9CiAgaWYgKHNhdmVkIHx8IHNhdmVkX2Z1bmN0aW9u X25hbWVfZGVjbHMpCiAgICAvKiBOb3JtYWxseSB0aGV5J2xsIGhhdmUgYmVl biBOVUxMLCBzbyBvbmx5IHB1c2ggaWYgd2UndmUgZ290IGEKICAgICAgIHN0 YWNrLCBvciB0aGV5IGFyZSBub24tTlVMTC4gICovCiAgICBzYXZlZF9mdW5j dGlvbl9uYW1lX2RlY2xzID0gdHJlZV9jb25zIChzYXZlZCwgTlVMTF9UUkVF LAoJCQkJCSAgIHNhdmVkX2Z1bmN0aW9uX25hbWVfZGVjbHMpOwp9CgovKiBG aW5pc2ggdXAgdGhlIGN1cnJlbnQgYmluZGluZ3MsIGFkZGluZyB0aGVtIGlu dG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24ncwogICBzdGF0ZW1lbnQgdHJlZS4g IFRoaXMgbXVzdCBiZSBkb25lIF9iZWZvcmVfIGZpbmlzaF9zdG10X3RyZWUg aXMgY2FsbGVkLgogICBJZiB0aGVyZSBpcyBubyBjdXJyZW50IGZ1bmN0aW9u LCB3ZSBtdXN0IGJlIGF0IGZpbGUgc2NvcGUgYW5kIG5vIHN0YXRlbWVudHMK ICAgYXJlIGludm9sdmVkLiBQb3AgdGhlIHByZXZpb3VzIGJpbmRpbmdzLiAg Ki8KCnZvaWQKZmluaXNoX2ZuYW1lX2RlY2xzICh2b2lkKQp7CiAgdW5zaWdu ZWQgaXg7CiAgdHJlZSBzdG10cyA9IE5VTExfVFJFRTsKICB0cmVlIHN0YWNr ID0gc2F2ZWRfZnVuY3Rpb25fbmFtZV9kZWNsczsKCiAgZm9yICg7IHN0YWNr ICYmIFRSRUVfVkFMVUUgKHN0YWNrKTsgc3RhY2sgPSBUUkVFX0NIQUlOIChz dGFjaykpCiAgICBhcHBlbmRfdG9fc3RhdGVtZW50X2xpc3QgKFRSRUVfVkFM VUUgKHN0YWNrKSwgJnN0bXRzKTsKCiAgaWYgKHN0bXRzKQogICAgewogICAg ICB0cmVlICpib2R5cCA9ICZERUNMX1NBVkVEX1RSRUUgKGN1cnJlbnRfZnVu Y3Rpb25fZGVjbCk7CgogICAgICBpZiAoVFJFRV9DT0RFICgqYm9keXApID09 IEJJTkRfRVhQUikKCWJvZHlwID0gJkJJTkRfRVhQUl9CT0RZICgqYm9keXAp OwoKICAgICAgYXBwZW5kX3RvX3N0YXRlbWVudF9saXN0X2ZvcmNlICgqYm9k eXAsICZzdG10cyk7CiAgICAgICpib2R5cCA9IHN0bXRzOwogICAgfQoKICBm b3IgKGl4ID0gMDsgZm5hbWVfdmFyc1tpeF0uZGVjbDsgaXgrKykKICAgICpm bmFtZV92YXJzW2l4XS5kZWNsID0gTlVMTF9UUkVFOwoKICBpZiAoc3RhY2sp CiAgICB7CiAgICAgIC8qIFdlIGhhZCBzYXZlZCB2YWx1ZXMsIHJlc3RvcmUg dGhlbS4gICovCiAgICAgIHRyZWUgc2F2ZWQ7CgogICAgICBmb3IgKHNhdmVk ID0gVFJFRV9QVVJQT1NFIChzdGFjayk7IHNhdmVkOyBzYXZlZCA9IFRSRUVf Q0hBSU4gKHNhdmVkKSkKCXsKCSAgdHJlZSBkZWNsID0gVFJFRV9QVVJQT1NF IChzYXZlZCk7CgkgIHVuc2lnbmVkIGl4ID0gVFJFRV9JTlRfQ1NUX0xPVyAo VFJFRV9WQUxVRSAoc2F2ZWQpKTsKCgkgICpmbmFtZV92YXJzW2l4XS5kZWNs ID0gZGVjbDsKCX0KICAgICAgc3RhY2sgPSBUUkVFX0NIQUlOIChzdGFjayk7 CiAgICB9CiAgc2F2ZWRfZnVuY3Rpb25fbmFtZV9kZWNscyA9IHN0YWNrOwp9 CgovKiBSZXR1cm4gdGhlIHRleHQgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5j dGlvbiwgc3VpdGFibHkgcHJldHRpZmllZAogICBieSBQUkVUVFlfUC4gIFJl dHVybiBzdHJpbmcgbXVzdCBiZSBmcmVlZCBieSBjYWxsZXIuICAqLwoKY29u c3QgY2hhciAqCmZuYW1lX2FzX3N0cmluZyAoaW50IHByZXR0eV9wKQp7CiAg Y29uc3QgY2hhciAqbmFtZSA9ICJ0b3AgbGV2ZWwiOwogIGNoYXIgKm5hbWVw OwogIGludCB2cmIgPSAyLCBsZW47CiAgY3BwX3N0cmluZyBjc3RyID0geyAw LCAwIH0sIHN0cm5hbWU7CgogIGlmICghcHJldHR5X3ApCiAgICB7CiAgICAg IG5hbWUgPSAiIjsKICAgICAgdnJiID0gMDsKICAgIH0KCiAgaWYgKGN1cnJl bnRfZnVuY3Rpb25fZGVjbCkKICAgIG5hbWUgPSBsYW5nX2hvb2tzLmRlY2xf cHJpbnRhYmxlX25hbWUgKGN1cnJlbnRfZnVuY3Rpb25fZGVjbCwgdnJiKTsK CiAgbGVuID0gc3RybGVuIChuYW1lKSArIDM7IC8qIFR3byBmb3IgJyIncy4g IE9uZSBmb3IgTlVMTC4gICovCgogIG5hbWVwID0gWE5FV1ZFQyAoY2hhciwg bGVuKTsKICBzbnByaW50ZiAobmFtZXAsIGxlbiwgIlwiJXNcIiIsIG5hbWUp OwogIHN0cm5hbWUudGV4dCA9ICh1bnNpZ25lZCBjaGFyICopIG5hbWVwOwog IHN0cm5hbWUubGVuID0gbGVuIC0gMTsKCiAgaWYgKGNwcF9pbnRlcnByZXRf c3RyaW5nIChwYXJzZV9pbiwgJnN0cm5hbWUsIDEsICZjc3RyLCBmYWxzZSkp CiAgICB7CiAgICAgIFhERUxFVEVWRUMgKG5hbWVwKTsKICAgICAgcmV0dXJu IChjb25zdCBjaGFyICopIGNzdHIudGV4dDsKICAgIH0KCiAgcmV0dXJuIG5h bWVwOwp9CgovKiBFeHBhbmQgREVDTCBpZiBpdCBkZWNsYXJlcyBhbiBlbnRp dHkgbm90IGhhbmRsZWQgYnkgdGhlCiAgIGNvbW1vbiBjb2RlLiAgKi8KCmlu dApjX2V4cGFuZF9kZWNsICh0cmVlIGRlY2wpCnsKICBpZiAoVFJFRV9DT0RF IChkZWNsKSA9PSBWQVJfREVDTCAmJiAhVFJFRV9TVEFUSUMgKGRlY2wpKQog ICAgewogICAgICAvKiBMZXQgdGhlIGJhY2stZW5kIGtub3cgYWJvdXQgdGhp cyB2YXJpYWJsZS4gICovCiAgICAgIGlmICghYW5vbl9hZ2dyX3R5cGVfcCAo VFJFRV9UWVBFIChkZWNsKSkpCgllbWl0X2xvY2FsX3ZhciAoZGVjbCk7CiAg ICAgIGVsc2UKCWV4cGFuZF9hbm9uX3VuaW9uX2RlY2wgKGRlY2wsIE5VTExf VFJFRSwKCQkJCURFQ0xfQU5PTl9VTklPTl9FTEVNUyAoZGVjbCkpOwogICAg fQogIGVsc2UKICAgIHJldHVybiAwOwoKICByZXR1cm4gMTsKfQoKCi8qIFJl dHVybiB0aGUgVkFSX0RFQ0wgZm9yIGEgY29uc3QgY2hhciBhcnJheSBuYW1p bmcgdGhlIGN1cnJlbnQKICAgZnVuY3Rpb24uIElmIHRoZSBWQVJfREVDTCBo YXMgbm90IHlldCBiZWVuIGNyZWF0ZWQsIGNyZWF0ZSBpdAogICBub3cuIFJJ RCBpbmRpY2F0ZXMgaG93IGl0IHNob3VsZCBiZSBmb3JtYXR0ZWQgYW5kIElE RU5USUZJRVJfTk9ERQogICBJRCBpcyBpdHMgbmFtZSAodW5mb3J0dW5hdGVs eSBDIGFuZCBDKysgaG9sZCB0aGUgUklEIHZhbHVlcyBvZgogICBrZXl3b3Jk cyBpbiBkaWZmZXJlbnQgcGxhY2VzLCBzbyB3ZSBjYW4ndCBkZXJpdmUgUklE IGZyb20gSUQgaW4KICAgdGhpcyBsYW5ndWFnZSBpbmRlcGVuZGVudCBjb2Rl LiAgKi8KCnRyZWUKZm5hbWVfZGVjbCAodW5zaWduZWQgaW50IHJpZCwgdHJl ZSBpZCkKewogIHVuc2lnbmVkIGl4OwogIHRyZWUgZGVjbCA9IE5VTExfVFJF RTsKCiAgZm9yIChpeCA9IDA7IGZuYW1lX3ZhcnNbaXhdLmRlY2w7IGl4Kysp CiAgICBpZiAoZm5hbWVfdmFyc1tpeF0ucmlkID09IHJpZCkKICAgICAgYnJl YWs7CgogIGRlY2wgPSAqZm5hbWVfdmFyc1tpeF0uZGVjbDsKICBpZiAoIWRl Y2wpCiAgICB7CiAgICAgIC8qIElmIGEgdHJlZSBpcyBidWlsdCBoZXJlLCBp dCB3b3VsZCBub3JtYWxseSBoYXZlIHRoZSBsaW5lbm8gb2YKCSB0aGUgY3Vy cmVudCBzdGF0ZW1lbnQuICBMYXRlciB0aGlzIHRyZWUgd2lsbCBiZSBtb3Zl ZCB0byB0aGUKCSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGlz IGxpbmUgbnVtYmVyIHdpbGwgYmUgd3JvbmcuCgkgVG8gYXZvaWQgdGhpcyBw cm9ibGVtIHNldCB0aGUgbGluZW5vIHRvIDAgaGVyZTsgdGhhdCBwcmV2ZW50 cwoJIGl0IGZyb20gYXBwZWFyaW5nIGluIHRoZSBSVEwuICAqLwogICAgICB0 cmVlIHN0bXRzOwogICAgICBsb2NhdGlvbl90IHNhdmVkX2xvY2F0aW9uID0g aW5wdXRfbG9jYXRpb247CiNpZmRlZiBVU0VfTUFQUEVEX0xPQ0FUSU9OCiAg ICAgIGlucHV0X2xvY2F0aW9uID0gVU5LTk9XTl9MT0NBVElPTjsKI2Vsc2UK ICAgICAgaW5wdXRfbGluZSA9IDA7CiNlbmRpZgoKICAgICAgc3RtdHMgPSBw dXNoX3N0bXRfbGlzdCAoKTsKICAgICAgZGVjbCA9ICgqbWFrZV9mbmFtZV9k ZWNsKSAoaWQsIGZuYW1lX3ZhcnNbaXhdLnByZXR0eSk7CiAgICAgIHN0bXRz ID0gcG9wX3N0bXRfbGlzdCAoc3RtdHMpOwogICAgICBpZiAoIUlTX0VNUFRZ X1NUTVQgKHN0bXRzKSkKCXNhdmVkX2Z1bmN0aW9uX25hbWVfZGVjbHMKCSAg PSB0cmVlX2NvbnMgKGRlY2wsIHN0bXRzLCBzYXZlZF9mdW5jdGlvbl9uYW1l X2RlY2xzKTsKICAgICAgKmZuYW1lX3ZhcnNbaXhdLmRlY2wgPSBkZWNsOwog ICAgICBpbnB1dF9sb2NhdGlvbiA9IHNhdmVkX2xvY2F0aW9uOwogICAgfQog IGlmICghaXggJiYgIWN1cnJlbnRfZnVuY3Rpb25fZGVjbCkKICAgIHBlZHdh cm4gKCIlcUQgaXMgbm90IGRlZmluZWQgb3V0c2lkZSBvZiBmdW5jdGlvbiBz Y29wZSIsIGRlY2wpOwoKICByZXR1cm4gZGVjbDsKfQoKLyogR2l2ZW4gYSBT VFJJTkdfQ1NULCBnaXZlIGl0IGEgc3VpdGFibGUgYXJyYXktb2YtY2hhcnMg ZGF0YSB0eXBlLiAgKi8KCnRyZWUKZml4X3N0cmluZ190eXBlICh0cmVlIHZh bHVlKQp7CiAgY29uc3QgaW50IHdjaGFyX2J5dGVzID0gVFlQRV9QUkVDSVNJ T04gKHdjaGFyX3R5cGVfbm9kZSkgLyBCSVRTX1BFUl9VTklUOwogIGNvbnN0 IGludCB3aWRlX2ZsYWcgPSBUUkVFX1RZUEUgKHZhbHVlKSA9PSB3Y2hhcl9h cnJheV90eXBlX25vZGU7CiAgaW50IGxlbmd0aCA9IFRSRUVfU1RSSU5HX0xF TkdUSCAodmFsdWUpOwogIGludCBuY2hhcnM7CiAgdHJlZSBlX3R5cGUsIGlf dHlwZSwgYV90eXBlOwoKICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZWxl bWVudHMsIGZvciB0aGUgYXJyYXkgdHlwZS4gICovCiAgbmNoYXJzID0gd2lk ZV9mbGFnID8gbGVuZ3RoIC8gd2NoYXJfYnl0ZXMgOiBsZW5ndGg7CgogIC8q IEM4OSAyLjIuNC4xLCBDOTkgNS4yLjQuMSAoVHJhbnNsYXRpb24gbGltaXRz KS4gIFRoZSBhbmFsb2dvdXMKICAgICBsaW1pdCBpbiBDKys5OCBBbm5leCBC IGlzIHZlcnkgbGFyZ2UgKDY1NTM2KSBhbmQgaXMgbm90IG5vcm1hdGl2ZSwK ICAgICBzbyB3ZSBkbyBub3QgZGlhZ25vc2UgaXQgKHdhcm5fb3Zlcmxlbmd0 aF9zdHJpbmdzIGlzIGZvcmNlZCBvZmYKICAgICBpbiBjX2NvbW1vbl9wb3N0 X29wdGlvbnMpLiAgKi8KICBpZiAod2Fybl9vdmVybGVuZ3RoX3N0cmluZ3Mp CiAgICB7CiAgICAgIGNvbnN0IGludCBuY2hhcnNfbWF4ID0gZmxhZ19pc29j OTkgPyA0MDk1IDogNTA5OwogICAgICBjb25zdCBpbnQgcmVsZXZhbnRfc3Rk ID0gZmxhZ19pc29jOTkgPyA5OSA6IDkwOwogICAgICBpZiAobmNoYXJzIC0g MSA+IG5jaGFyc19tYXgpCgkvKiBUcmFuc2xhdG9yczogVGhlICVkIGFmdGVy ICdJU08gQycgd2lsbCBiZSA5MCBvciA5OS4gIERvIG5vdAoJICAgc2VwYXJh dGUgdGhlICVkIGZyb20gdGhlICdDJy4gICdJU08nIHNob3VsZCBub3QgYmUK CSAgIHRyYW5zbGF0ZWQsIGJ1dCBpdCBtYXkgYmUgbW92ZWQgYWZ0ZXIgJ0Ml ZCcgaW4gbGFuZ3VhZ2VzCgkgICB3aGVyZSBtb2RpZmllcnMgZm9sbG93IG5v dW5zLiAgKi8KCXBlZHdhcm4gKCJzdHJpbmcgbGVuZ3RoICVxZCBpcyBncmVh dGVyIHRoYW4gdGhlIGxlbmd0aCAlcWQgIgoJCSAiSVNPIEMlZCBjb21waWxl cnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQiLAoJCSBuY2hhcnMgLSAxLCBu Y2hhcnNfbWF4LCByZWxldmFudF9zdGQpOwogICAgfQoKICAvKiBDcmVhdGUg dGhlIGFycmF5IHR5cGUgZm9yIHRoZSBzdHJpbmcgY29uc3RhbnQuICBUaGUg SVNPIEMrKwogICAgIHN0YW5kYXJkIHNheXMgdGhhdCBhIHN0cmluZyBsaXRl cmFsIGhhcyB0eXBlIGBjb25zdCBjaGFyW05dJyBvcgogICAgIGBjb25zdCB3 Y2hhcl90W05dJy4gIFdlIHVzZSB0aGUgc2FtZSBsb2dpYyB3aGVuIGludm9r ZWQgYXMgYSBDCiAgICAgZnJvbnQtZW5kIHdpdGggLVd3cml0ZS1zdHJpbmdz LgogICAgID8/PyBXZSBzaG91bGQgY2hhbmdlIHRoZSB0eXBlIG9mIGFuIGV4 cHJlc3Npb24gZGVwZW5kaW5nIG9uIHRoZQogICAgIHN0YXRlIG9mIGEgd2Fy bmluZyBmbGFnLiAgV2Ugc2hvdWxkIGp1c3QgYmUgd2FybmluZyAtLSBzZWUg aG93CiAgICAgdGhpcyBpcyBoYW5kbGVkIGluIHRoZSBDKysgZnJvbnQtZW5k IGZvciB0aGUgZGVwcmVjYXRlZCBpbXBsaWNpdAogICAgIGNvbnZlcnNpb24g ZnJvbSBzdHJpbmcgbGl0ZXJhbHMgdG8gYGNoYXIqJyBvciBgd2NoYXJfdCon LgoKICAgICBUaGUgQysrIGZyb250IGVuZCByZWxpZXMgb24gVFlQRV9NQUlO X1ZBUklBTlQgb2YgYSBjdi1xdWFsaWZpZWQKICAgICBhcnJheSB0eXBlIGJl aW5nIHRoZSB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoYXQgdHlwZS4KICAg ICBUaGVyZWZvcmUsIGlmIHdlIGFyZSBjb25zdHJ1Y3RpbmcgYW4gYXJyYXkg b2YgY29uc3QgY2hhciwgd2UgbXVzdAogICAgIGNvbnN0cnVjdCB0aGUgbWF0 Y2hpbmcgdW5xdWFsaWZpZWQgYXJyYXkgdHlwZSBmaXJzdC4gIFRoZSBDIGZy b250CiAgICAgZW5kIGRvZXMgbm90IHJlcXVpcmUgdGhpcywgYnV0IGl0IGRv ZXMgbm8gaGFybSwgc28gd2UgZG8gaXQKICAgICB1bmNvbmRpdGlvbmFsbHku ICAqLwogIGVfdHlwZSA9IHdpZGVfZmxhZyA/IHdjaGFyX3R5cGVfbm9kZSA6 IGNoYXJfdHlwZV9ub2RlOwogIGlfdHlwZSA9IGJ1aWxkX2luZGV4X3R5cGUg KGJ1aWxkX2ludF9jc3QgKE5VTExfVFJFRSwgbmNoYXJzIC0gMSkpOwogIGFf dHlwZSA9IGJ1aWxkX2FycmF5X3R5cGUgKGVfdHlwZSwgaV90eXBlKTsKICBp ZiAoY19kaWFsZWN0X2N4eCgpIHx8IHdhcm5fd3JpdGVfc3RyaW5ncykKICAg IGFfdHlwZSA9IGNfYnVpbGRfcXVhbGlmaWVkX3R5cGUgKGFfdHlwZSwgVFlQ RV9RVUFMX0NPTlNUKTsKCiAgVFJFRV9UWVBFICh2YWx1ZSkgPSBhX3R5cGU7 CiAgVFJFRV9DT05TVEFOVCAodmFsdWUpID0gMTsKICBUUkVFX0lOVkFSSUFO VCAodmFsdWUpID0gMTsKICBUUkVFX1JFQURPTkxZICh2YWx1ZSkgPSAxOwog IFRSRUVfU1RBVElDICh2YWx1ZSkgPSAxOwogIHJldHVybiB2YWx1ZTsKfQoM Ci8qIFByaW50IGEgd2FybmluZyBpZiBhIGNvbnN0YW50IGV4cHJlc3Npb24g aGFkIG92ZXJmbG93IGluIGZvbGRpbmcuCiAgIEludm9rZSB0aGlzIGZ1bmN0 aW9uIG9uIGV2ZXJ5IGV4cHJlc3Npb24gdGhhdCB0aGUgbGFuZ3VhZ2UKICAg cmVxdWlyZXMgdG8gYmUgYSBjb25zdGFudCBleHByZXNzaW9uLgogICBOb3Rl IHRoZSBBTlNJIEMgc3RhbmRhcmQgc2F5cyBpdCBpcyBlcnJvbmVvdXMgZm9y IGEKICAgY29uc3RhbnQgZXhwcmVzc2lvbiB0byBvdmVyZmxvdy4gICovCgp2 b2lkCmNvbnN0YW50X2V4cHJlc3Npb25fd2FybmluZyAodHJlZSB2YWx1ZSkK ewogIGlmICgoVFJFRV9DT0RFICh2YWx1ZSkgPT0gSU5URUdFUl9DU1QgfHwg VFJFRV9DT0RFICh2YWx1ZSkgPT0gUkVBTF9DU1QKICAgICAgIHx8IFRSRUVf Q09ERSAodmFsdWUpID09IEZJWEVEX0NTVAogICAgICAgfHwgVFJFRV9DT0RF ICh2YWx1ZSkgPT0gVkVDVE9SX0NTVAogICAgICAgfHwgVFJFRV9DT0RFICh2 YWx1ZSkgPT0gQ09NUExFWF9DU1QpCiAgICAgICYmIFRSRUVfT1ZFUkZMT1cg KHZhbHVlKQogICAgICAmJiB3YXJuX292ZXJmbG93CiAgICAgICYmIHBlZGFu dGljKQogICAgcGVkd2FybiAoIm92ZXJmbG93IGluIGNvbnN0YW50IGV4cHJl c3Npb24iKTsKfQoKLyogUHJpbnQgYSB3YXJuaW5nIGlmIGFuIGV4cHJlc3Np b24gaGFkIG92ZXJmbG93IGluIGZvbGRpbmcgYW5kIGl0cwogICBvcGVyYW5k cyBoYWRuJ3QuCgogICBJbnZva2UgdGhpcyBmdW5jdGlvbiBvbiBldmVyeSBl eHByZXNzaW9uIHRoYXQKICAgKDEpIGFwcGVhcnMgaW4gdGhlIHNvdXJjZSBj b2RlLCBhbmQKICAgKDIpIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiB0aGF0 IG92ZXJmbG93ZWQsIGFuZAogICAoMykgaXMgbm90IGFscmVhZHkgY2hlY2tl ZCBieSBjb252ZXJ0X2FuZF9jaGVjazsKICAgaG93ZXZlciwgZG8gbm90IGlu dm9rZSB0aGlzIGZ1bmN0aW9uIG9uIG9wZXJhbmRzIG9mIGV4cGxpY2l0IGNh c3RzCiAgIG9yIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgdGhlIHJlc3VsdCBv ZiBhbiBvcGVyYXRvciBhbmQgYW55IG9wZXJhbmQKICAgYWxyZWFkeSBvdmVy Zmxvd2VkLiAgKi8KCnZvaWQKb3ZlcmZsb3dfd2FybmluZyAodHJlZSB2YWx1 ZSkKewogIGlmIChza2lwX2V2YWx1YXRpb24pIHJldHVybjsKCiAgc3dpdGNo IChUUkVFX0NPREUgKHZhbHVlKSkKICAgIHsKICAgIGNhc2UgSU5URUdFUl9D U1Q6CiAgICAgIHdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csICJpbnRlZ2VyIG92 ZXJmbG93IGluIGV4cHJlc3Npb24iKTsKICAgICAgYnJlYWs7CiAgICAgIAog ICAgY2FzZSBSRUFMX0NTVDoKICAgICAgd2FybmluZyAoT1BUX1dvdmVyZmxv dywgImZsb2F0aW5nIHBvaW50IG92ZXJmbG93IGluIGV4cHJlc3Npb24iKTsK ICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBGSVhFRF9DU1Q6CiAgICAg IHdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csICJmaXhlZC1wb2ludCBvdmVyZmxv dyBpbiBleHByZXNzaW9uIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgVkVD VE9SX0NTVDoKICAgICAgd2FybmluZyAoT1BUX1dvdmVyZmxvdywgInZlY3Rv ciBvdmVyZmxvdyBpbiBleHByZXNzaW9uIik7CiAgICAgIGJyZWFrOwogICAg ICAKICAgIGNhc2UgQ09NUExFWF9DU1Q6CiAgICAgIGlmIChUUkVFX0NPREUg KFRSRUVfUkVBTFBBUlQgKHZhbHVlKSkgPT0gSU5URUdFUl9DU1QpCgl3YXJu aW5nIChPUFRfV292ZXJmbG93LCAiY29tcGxleCBpbnRlZ2VyIG92ZXJmbG93 IGluIGV4cHJlc3Npb24iKTsKICAgICAgZWxzZSBpZiAoVFJFRV9DT0RFIChU UkVFX1JFQUxQQVJUICh2YWx1ZSkpID09IFJFQUxfQ1NUKQoJd2FybmluZyAo T1BUX1dvdmVyZmxvdywgImNvbXBsZXggZmxvYXRpbmcgcG9pbnQgb3ZlcmZs b3cgaW4gZXhwcmVzc2lvbiIpOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0 OgogICAgICBicmVhazsKICAgIH0KfQoKCi8qIFdhcm4gYWJvdXQgdXNlIG9m IGEgbG9naWNhbCB8fCAvICYmIG9wZXJhdG9yIGJlaW5nIHVzZWQgaW4gYQog ICBjb250ZXh0IHdoZXJlIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBiaXR3aXNl IGVxdWl2YWxlbnQgd2FzIGludGVuZGVkCiAgIGJ5IHRoZSBwcm9ncmFtbWVy LiBDT0RFIGlzIHRoZSBUUkVFX0NPREUgb2YgdGhlIG9wZXJhdG9yLCBBUkcx CiAgIGFuZCBBUkcyIHRoZSBhcmd1bWVudHMuICAqLwoKdm9pZAp3YXJuX2xv Z2ljYWxfb3BlcmF0b3IgKGVudW0gdHJlZV9jb2RlIGNvZGUsIHRyZWUgYXJn MSwgdHJlZQogICAgYXJnMikKewogIHN3aXRjaCAoY29kZSkKICAgIHsKICAg ICAgY2FzZSBUUlVUSF9BTkRJRl9FWFBSOgogICAgICBjYXNlIFRSVVRIX09S SUZfRVhQUjoKICAgICAgY2FzZSBUUlVUSF9PUl9FWFBSOgogICAgICBjYXNl IFRSVVRIX0FORF9FWFBSOgoJaWYgKCFUUkVFX05PX1dBUk5JTkcgKGFyZzEp CgkgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKGFyZzEpKQoJ ICAgICYmICFDT05TVEFOVF9DTEFTU19QIChhcmcxKQoJICAgICYmIFRSRUVf Q09ERSAoYXJnMikgPT0gSU5URUdFUl9DU1QKCSAgICAmJiAhaW50ZWdlcl96 ZXJvcCAoYXJnMikpCgkgIHsKCSAgICB3YXJuaW5nIChPUFRfV2xvZ2ljYWxf b3AsCgkJICAgICAibG9naWNhbCAlPCVzJT4gd2l0aCBub24temVybyBjb25z dGFudCAiCgkJICAgICAid2lsbCBhbHdheXMgZXZhbHVhdGUgYXMgdHJ1ZSIs CgkJICAgICAoKGNvZGUgPT0gVFJVVEhfQU5ESUZfRVhQUikKCQkgICAgICB8 fCAoY29kZSA9PSBUUlVUSF9BTkRfRVhQUikpID8gIiYmIiA6ICJ8fCIpOwoJ ICAgIFRSRUVfTk9fV0FSTklORyAoYXJnMSkgPSB0cnVlOwoJICB9CglicmVh azsKICAgICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQp9CgoKLyogUHJpbnQg YSB3YXJuaW5nIGFib3V0IGNhc3RzIHRoYXQgbWlnaHQgaW5kaWNhdGUgdmlv bGF0aW9uCiAgIG9mIHN0cmljdCBhbGlhc2luZyBydWxlcyBpZiAtV3N0cmlj dC1hbGlhc2luZyBpcyB1c2VkIGFuZAogICBzdHJpY3QgYWxpYXNpbmcgbW9k ZSBpcyBpbiBlZmZlY3QuIE9UWVBFIGlzIHRoZSBvcmlnaW5hbAogICBUUkVF X1RZUEUgb2YgRVhQUiwgYW5kIFRZUEUgdGhlIHR5cGUgd2UncmUgY2FzdGlu ZyB0by4gKi8KCmJvb2wKc3RyaWN0X2FsaWFzaW5nX3dhcm5pbmcgKHRyZWUg b3R5cGUsIHRyZWUgdHlwZSwgdHJlZSBleHByKQp7CiAgaWYgKCEoZmxhZ19z dHJpY3RfYWxpYXNpbmcgJiYgUE9JTlRFUl9UWVBFX1AgKHR5cGUpIAogICAg ICAgICYmIFBPSU5URVJfVFlQRV9QIChvdHlwZSkgJiYgIVZPSURfVFlQRV9Q IChUUkVFX1RZUEUgKHR5cGUpKSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlm ICgod2Fybl9zdHJpY3RfYWxpYXNpbmcgPiAxKSAmJiBUUkVFX0NPREUgKGV4 cHIpID09IEFERFJfRVhQUgogICAgICAmJiAoREVDTF9QIChUUkVFX09QRVJB TkQgKGV4cHIsIDApKQogICAgICAgICAgfHwgaGFuZGxlZF9jb21wb25lbnRf cCAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpKQogICAgewogICAgICAvKiBD YXN0aW5nIHRoZSBhZGRyZXNzIG9mIGFuIG9iamVjdCB0byBub24gdm9pZCBw b2ludGVyLiBXYXJuCiAgICAgICAgIGlmIHRoZSBjYXN0IGJyZWFrcyB0eXBl IGJhc2VkIGFsaWFzaW5nLiAgKi8KICAgICAgaWYgKCFDT01QTEVURV9UWVBF X1AgKFRSRUVfVFlQRSAodHlwZSkpICYmIHdhcm5fc3RyaWN0X2FsaWFzaW5n ID09IDIpCgl7CgkgIHdhcm5pbmcgKE9QVF9Xc3RyaWN0X2FsaWFzaW5nLCAi dHlwZS1wdW5uaW5nIHRvIGluY29tcGxldGUgdHlwZSAiCgkJICAgIm1pZ2h0 IGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIpOwoJICByZXR1cm4gdHJ1 ZTsKCX0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8qIHdhcm5f c3RyaWN0X2FsaWFzaW5nID49IDMuICAgVGhpcyBpbmNsdWRlcyB0aGUgZGVm YXVsdCAoMykuICAKICAgICAgICAgICAgIE9ubHkgd2FybiBpZiB0aGUgY2Fz dCBpcyBkZXJlZmVyZW5jZWQgaW1tZWRpYXRlbHkuICAqLwogICAgICAgICAg YWxpYXNfc2V0X3R5cGUgc2V0MSA9CgkgICAgZ2V0X2FsaWFzX3NldCAoVFJF RV9UWVBFIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSk7CiAgICAgICAgICBh bGlhc19zZXRfdHlwZSBzZXQyID0gZ2V0X2FsaWFzX3NldCAoVFJFRV9UWVBF ICh0eXBlKSk7CgogICAgICAgICAgaWYgKCFhbGlhc19zZXRzX2NvbmZsaWN0 X3AgKHNldDEsIHNldDIpKQoJICAgIHsKCSAgICAgIHdhcm5pbmcgKE9QVF9X c3RyaWN0X2FsaWFzaW5nLCAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCAi CgkJICAgICAgICJwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5n IHJ1bGVzIik7CgkgICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9CiAgICAgICAg ICBlbHNlIGlmICh3YXJuX3N0cmljdF9hbGlhc2luZyA9PSAyCgkJICAgJiYg IWFsaWFzX3NldHNfbXVzdF9jb25mbGljdF9wIChzZXQxLCBzZXQyKSkKCSAg ICB7CgkgICAgICB3YXJuaW5nIChPUFRfV3N0cmljdF9hbGlhc2luZywgImRl cmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgIgoJCSAgICAgICAicG9pbnRlciBt aWdodCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiKTsKCSAgICAgIHJl dHVybiB0cnVlOwoJICAgIH0KICAgICAgICB9CiAgICB9CiAgZWxzZQogICAg aWYgKCh3YXJuX3N0cmljdF9hbGlhc2luZyA9PSAxKSAmJiAhVk9JRF9UWVBF X1AgKFRSRUVfVFlQRSAob3R5cGUpKSkKICAgICAgewogICAgICAgIC8qIEF0 IHRoaXMgbGV2ZWwsIHdhcm4gZm9yIGFueSBjb252ZXJzaW9ucywgZXZlbiBp ZiBhbiBhZGRyZXNzIGlzCiAgICAgICAgICAgbm90IHRha2VuIGluIHRoZSBz YW1lIHN0YXRlbWVudC4gIFRoaXMgd2lsbCBsaWtlbHkgcHJvZHVjZSBtYW55 CiAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzLCBidXQgY291bGQgYmUgdXNl ZnVsIHRvIHBpbnBvaW50IHByb2JsZW1zIHRoYXQKICAgICAgICAgICBhcmUg bm90IHJldmVhbGVkIGF0IGhpZ2hlciBsZXZlbHMuICAqLwogICAgICAgIGFs aWFzX3NldF90eXBlIHNldDEgPSBnZXRfYWxpYXNfc2V0IChUUkVFX1RZUEUg KG90eXBlKSk7CiAgICAgICAgYWxpYXNfc2V0X3R5cGUgc2V0MiA9IGdldF9h bGlhc19zZXQgKFRSRUVfVFlQRSAodHlwZSkpOwogICAgICAgIGlmICghQ09N UExFVEVfVFlQRV9QICh0eXBlKQogICAgICAgICAgICB8fCAhYWxpYXNfc2V0 c19tdXN0X2NvbmZsaWN0X3AgKHNldDEsIHNldDIpKQoJICB7CiAgICAgICAg ICAgIHdhcm5pbmcgKE9QVF9Xc3RyaWN0X2FsaWFzaW5nLCAiZGVyZWZlcmVu Y2luZyB0eXBlLXB1bm5lZCAiCiAgICAgICAgICAgICAgICAgICAgICJwb2lu dGVyIG1pZ2h0IGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIpOwogICAg ICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgfQoKICBy ZXR1cm4gZmFsc2U7Cn0KCi8qIFByaW50IGEgd2FybmluZyBhYm91dCBpZiAo KTsgb3IgaWYgKCkgLi4gZWxzZTsgY29uc3RydWN0cwogICB2aWEgdGhlIHNw ZWNpYWwgZW1wdHkgc3RhdGVtZW50IG5vZGUgdGhhdCB3ZSBjcmVhdGUuICBJ Tk5FUl9USEVOCiAgIGFuZCBJTk5FUl9FTFNFIGFyZSB0aGUgc3RhdGVtZW50 IGxpc3RzIG9mIHRoZSBpZiBhbmQgdGhlIGVsc2UKICAgYmxvY2suICAqLwoK dm9pZAplbXB0eV9pZl9ib2R5X3dhcm5pbmcgKHRyZWUgaW5uZXJfdGhlbiwg dHJlZSBpbm5lcl9lbHNlKQp7CiAgaWYgKFRSRUVfQ09ERSAoaW5uZXJfdGhl bikgPT0gU1RBVEVNRU5UX0xJU1QKICAgICAgJiYgU1RBVEVNRU5UX0xJU1Rf VEFJTCAoaW5uZXJfdGhlbikpCiAgICBpbm5lcl90aGVuID0gU1RBVEVNRU5U X0xJU1RfVEFJTCAoaW5uZXJfdGhlbiktPnN0bXQ7CgogIGlmIChpbm5lcl9l bHNlICYmIFRSRUVfQ09ERSAoaW5uZXJfZWxzZSkgPT0gU1RBVEVNRU5UX0xJ U1QKICAgICAgJiYgU1RBVEVNRU5UX0xJU1RfVEFJTCAoaW5uZXJfZWxzZSkp CiAgICBpbm5lcl9lbHNlID0gU1RBVEVNRU5UX0xJU1RfVEFJTCAoaW5uZXJf ZWxzZSktPnN0bXQ7CgogIGlmIChJU19FTVBUWV9TVE1UIChpbm5lcl90aGVu KSAmJiAhaW5uZXJfZWxzZSkKICAgIHdhcm5pbmcgKE9QVF9XZW1wdHlfYm9k eSwgIiVIc3VnZ2VzdCBicmFjZXMgYXJvdW5kIGVtcHR5IGJvZHkgIgogICAg ICAgICAgICAgImluIGFuICU8aWYlPiBzdGF0ZW1lbnQiLCBFWFBSX0xPQ1VT IChpbm5lcl90aGVuKSk7CgogIGVsc2UgaWYgKGlubmVyX2Vsc2UgJiYgSVNf RU1QVFlfU1RNVCAoaW5uZXJfZWxzZSkpCiAgICB3YXJuaW5nIChPUFRfV2Vt cHR5X2JvZHksICIlSHN1Z2dlc3QgYnJhY2VzIGFyb3VuZCBlbXB0eSBib2R5 ICIKICAgICAgICAgICAgICJpbiBhbiAlPGVsc2UlPiBzdGF0ZW1lbnQiLCBF WFBSX0xPQ1VTIChpbm5lcl9lbHNlKSk7Cn0KCi8qIFdhcm4gZm9yIHVubGlr ZWx5LCBpbXByb2JhYmxlLCBvciBzdHVwaWQgREVDTCBkZWNsYXJhdGlvbnMK ICAgb2YgYG1haW4nLiAgKi8KCnZvaWQKY2hlY2tfbWFpbl9wYXJhbWV0ZXJf dHlwZXMgKHRyZWUgZGVjbCkKewogIHRyZWUgYXJnczsKICBpbnQgYXJnY3Qg PSAwOwoKICBmb3IgKGFyZ3MgPSBUWVBFX0FSR19UWVBFUyAoVFJFRV9UWVBF IChkZWNsKSk7IGFyZ3M7CiAgICAgIGFyZ3MgPSBUUkVFX0NIQUlOIChhcmdz KSkKICAgewogICAgIHRyZWUgdHlwZSA9IGFyZ3MgPyBUUkVFX1ZBTFVFIChh cmdzKSA6IDA7CgogICAgIGlmICh0eXBlID09IHZvaWRfdHlwZV9ub2RlIHx8 IHR5cGUgPT0gZXJyb3JfbWFya19ub2RlICkKICAgICAgIGJyZWFrOwoKICAg ICArK2FyZ2N0OwogICAgIHN3aXRjaCAoYXJnY3QpCiAgICAgICB7CiAgICAg ICBjYXNlIDE6CiAgICAgICAgIGlmIChUWVBFX01BSU5fVkFSSUFOVCAodHlw ZSkgIT0gaW50ZWdlcl90eXBlX25vZGUpCiAgICAgICAgICAgcGVkd2FybiAo ImZpcnN0IGFyZ3VtZW50IG9mICVxK0Qgc2hvdWxkIGJlICU8aW50JT4iLCBk ZWNsKTsKICAgICAgICAgYnJlYWs7CgogICAgICAgY2FzZSAyOgogICAgICAg ICBpZiAoVFJFRV9DT0RFICh0eXBlKSAhPSBQT0lOVEVSX1RZUEUKICAgICAg ICAgICAgIHx8IFRSRUVfQ09ERSAoVFJFRV9UWVBFICh0eXBlKSkgIT0gUE9J TlRFUl9UWVBFCiAgICAgICAgICAgICB8fCAoVFlQRV9NQUlOX1ZBUklBTlQg KFRSRUVfVFlQRSAoVFJFRV9UWVBFICh0eXBlKSkpCiAgICAgICAgICAgICAg ICAgIT0gY2hhcl90eXBlX25vZGUpKQogICAgICAgICAgIHBlZHdhcm4gKCJz ZWNvbmQgYXJndW1lbnQgb2YgJXErRCBzaG91bGQgYmUgJTxjaGFyICoqJT4i LAogICAgICAgICAgICAgICAgICAgIGRlY2wpOwogICAgICAgICBicmVhazsK CiAgICAgICBjYXNlIDM6CiAgICAgICAgIGlmIChUUkVFX0NPREUgKHR5cGUp ICE9IFBPSU5URVJfVFlQRQogICAgICAgICAgICAgfHwgVFJFRV9DT0RFIChU UkVFX1RZUEUgKHR5cGUpKSAhPSBQT0lOVEVSX1RZUEUKICAgICAgICAgICAg IHx8IChUWVBFX01BSU5fVkFSSUFOVCAoVFJFRV9UWVBFIChUUkVFX1RZUEUg KHR5cGUpKSkKICAgICAgICAgICAgICAgICAhPSBjaGFyX3R5cGVfbm9kZSkp CiAgICAgICAgICAgcGVkd2FybiAoInRoaXJkIGFyZ3VtZW50IG9mICVxK0Qg c2hvdWxkIHByb2JhYmx5IGJlICIKICAgICAgICAgICAgICAgICAgICAiJTxj aGFyICoqJT4iLCBkZWNsKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAg IH0KCiAgLyogSXQgaXMgaW50ZW50aW9uYWwgdGhhdCB0aGlzIG1lc3NhZ2Ug ZG9lcyBub3QgbWVudGlvbiB0aGUgdGhpcmQKICAgIGFyZ3VtZW50IGJlY2F1 c2UgaXQncyBvbmx5IG1lbnRpb25lZCBpbiBhbiBhcHBlbmRpeCBvZiB0aGUK ICAgIHN0YW5kYXJkLiAgKi8KICBpZiAoYXJnY3QgPiAwICYmIChhcmdjdCA8 IDIgfHwgYXJnY3QgPiAzKSkKICAgcGVkd2FybiAoIiVxK0QgdGFrZXMgb25s eSB6ZXJvIG9yIHR3byBhcmd1bWVudHMiLCBkZWNsKTsKfQoKLyogVHJ1ZSBp ZiB2ZWN0b3IgdHlwZXMgVDEgYW5kIFQyIGNhbiBiZSBjb252ZXJ0ZWQgdG8g ZWFjaCBvdGhlcgogICB3aXRob3V0IGFuIGV4cGxpY2l0IGNhc3QuICBJZiBF TUlUX0xBWF9OT1RFIGlzIHRydWUsIGFuZCBUMSBhbmQgVDIKICAgY2FuIG9u bHkgYmUgY29udmVydGVkIHdpdGggLWZsYXgtdmVjdG9yLWNvbnZlcnNpb25z IHlldCB0aGF0IGlzIG5vdAogICBpbiBlZmZlY3QsIGVtaXQgYSBub3RlIHRl bGxpbmcgdGhlIHVzZXIgYWJvdXQgdGhhdCBvcHRpb24gaWYgc3VjaAogICBh IG5vdGUgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gZW1pdHRlZC4gICovCmJv b2wKdmVjdG9yX3R5cGVzX2NvbnZlcnRpYmxlX3AgKGNvbnN0X3RyZWUgdDEs IGNvbnN0X3RyZWUgdDIsIGJvb2wgZW1pdF9sYXhfbm90ZSkKewogIHN0YXRp YyBib29sIGVtaXR0ZWRfbGF4X25vdGUgPSBmYWxzZTsKICBib29sIGNvbnZl cnRpYmxlX2xheDsKCiAgaWYgKCh0YXJnZXRtLnZlY3Rvcl9vcGFxdWVfcCAo dDEpIHx8IHRhcmdldG0udmVjdG9yX29wYXF1ZV9wICh0MikpCiAgICAgICYm IHRyZWVfaW50X2NzdF9lcXVhbCAoVFlQRV9TSVpFICh0MSksIFRZUEVfU0la RSAodDIpKSkKICAgIHJldHVybiB0cnVlOwoKICBjb252ZXJ0aWJsZV9sYXgg PQogICAgKHRyZWVfaW50X2NzdF9lcXVhbCAoVFlQRV9TSVpFICh0MSksIFRZ UEVfU0laRSAodDIpKQogICAgICYmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAo dDEpKSAhPSBSRUFMX1RZUEUgfHwKCSBUWVBFX1BSRUNJU0lPTiAodDEpID09 IFRZUEVfUFJFQ0lTSU9OICh0MikpCiAgICAgJiYgKElOVEVHUkFMX1RZUEVf UCAoVFJFRV9UWVBFICh0MSkpCgkgPT0gSU5URUdSQUxfVFlQRV9QIChUUkVF X1RZUEUgKHQyKSkpKTsKCiAgaWYgKCFjb252ZXJ0aWJsZV9sYXggfHwgZmxh Z19sYXhfdmVjdG9yX2NvbnZlcnNpb25zKQogICAgcmV0dXJuIGNvbnZlcnRp YmxlX2xheDsKCiAgaWYgKFRZUEVfVkVDVE9SX1NVQlBBUlRTICh0MSkgPT0g VFlQRV9WRUNUT1JfU1VCUEFSVFMgKHQyKQogICAgICAmJiBjb21wdHlwZXMg KFRSRUVfVFlQRSAodDEpLCBUUkVFX1RZUEUgKHQyKSkpCiAgICByZXR1cm4g dHJ1ZTsKCiAgaWYgKGVtaXRfbGF4X25vdGUgJiYgIWVtaXR0ZWRfbGF4X25v dGUpCiAgICB7CiAgICAgIGVtaXR0ZWRfbGF4X25vdGUgPSB0cnVlOwogICAg ICBpbmZvcm0gKCJ1c2UgLWZsYXgtdmVjdG9yLWNvbnZlcnNpb25zIHRvIHBl cm1pdCAiCiAgICAgICAgICAgICAgImNvbnZlcnNpb25zIGJldHdlZW4gdmVj dG9ycyB3aXRoIGRpZmZlcmluZyAiCiAgICAgICAgICAgICAgImVsZW1lbnQg dHlwZXMgb3IgbnVtYmVycyBvZiBzdWJwYXJ0cyIpOwogICAgfQoKICByZXR1 cm4gZmFsc2U7Cn0KCi8qIFdhcm5zIGlmIHRoZSBjb252ZXJzaW9uIG9mIEVY UFIgdG8gVFlQRSBtYXkgYWx0ZXIgYSB2YWx1ZS4KICAgVGhpcyBpcyBhIGhl bHBlciBmdW5jdGlvbiBmb3Igd2FybmluZ3NfZm9yX2NvbnZlcnRfYW5kX2No ZWNrLiAgKi8KCnN0YXRpYyB2b2lkCmNvbnZlcnNpb25fd2FybmluZyAodHJl ZSB0eXBlLCB0cmVlIGV4cHIpCnsKICBib29sIGdpdmVfd2FybmluZyA9IGZh bHNlOwoKICB1bnNpZ25lZCBpbnQgZm9ybWFsX3ByZWMgPSBUWVBFX1BSRUNJ U0lPTiAodHlwZSk7CgogIGlmICghd2Fybl9jb252ZXJzaW9uICYmICF3YXJu X3NpZ25fY29udmVyc2lvbikKICAgIHJldHVybjsKCiAgaWYgKFRSRUVfQ09E RSAoZXhwcikgPT0gUkVBTF9DU1QgfHwgVFJFRV9DT0RFIChleHByKSA9PSBJ TlRFR0VSX0NTVCkKICAgIHsKICAgICAgLyogV2FybiBmb3IgcmVhbCBjb25z dGFudCB0aGF0IGlzIG5vdCBhbiBleGFjdCBpbnRlZ2VyIGNvbnZlcnRlZAog ICAgICAgICB0byBpbnRlZ2VyIHR5cGUuICAqLwogICAgICBpZiAoVFJFRV9D T0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBSRUFMX1RZUEUKICAgICAgICAg ICYmIFRSRUVfQ09ERSAodHlwZSkgPT0gSU5URUdFUl9UWVBFKQogICAgICAg IHsKICAgICAgICAgIGlmICghcmVhbF9pc2ludGVnZXIgKFRSRUVfUkVBTF9D U1RfUFRSIChleHByKSwgVFlQRV9NT0RFIChUUkVFX1RZUEUgKGV4cHIpKSkp CiAgICAgICAgICAgIGdpdmVfd2FybmluZyA9IHRydWU7CiAgICAgICAgfQog ICAgICAvKiBXYXJuIGZvciBhbiBpbnRlZ2VyIGNvbnN0YW50IHRoYXQgZG9l cyBub3QgZml0IGludG8gaW50ZWdlciB0eXBlLiAgKi8KICAgICAgZWxzZSBp ZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBJTlRFR0VSX1RZ UEUKICAgICAgICAgICAgICAgJiYgVFJFRV9DT0RFICh0eXBlKSA9PSBJTlRF R0VSX1RZUEUKICAgICAgICAgICAgICAgJiYgIWludF9maXRzX3R5cGVfcCAo ZXhwciwgdHlwZSkpCiAgICAgICAgewogICAgICAgICAgaWYgKFRZUEVfVU5T SUdORUQgKHR5cGUpICYmICFUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKGV4 cHIpKSkKCSAgICB3YXJuaW5nIChPUFRfV3NpZ25fY29udmVyc2lvbiwKCQkg ICAgICJuZWdhdGl2ZSBpbnRlZ2VyIGltcGxpY2l0bHkgY29udmVydGVkIHRv IHVuc2lnbmVkIHR5cGUiKTsKICAgICAgICAgIGVsc2UgaWYgKCFUWVBFX1VO U0lHTkVEICh0eXBlKSAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKGV4 cHIpKSkKCSAgICB3YXJuaW5nIChPUFRfV3NpZ25fY29udmVyc2lvbiwKCQkg ICAgICJjb252ZXJzaW9uIG9mIHVuc2lnbmVkIGNvbnN0YW50IHZhbHVlIHRv IG5lZ2F0aXZlIGludGVnZXIiKTsKCSAgZWxzZQoJICAgIGdpdmVfd2Fybmlu ZyA9IHRydWU7CiAgICAgICAgfQogICAgICBlbHNlIGlmIChUUkVFX0NPREUg KHR5cGUpID09IFJFQUxfVFlQRSkKICAgICAgICB7CiAgICAgICAgICAvKiBX YXJuIGZvciBhbiBpbnRlZ2VyIGNvbnN0YW50IHRoYXQgZG9lcyBub3QgZml0 IGludG8gcmVhbCB0eXBlLiAgKi8KICAgICAgICAgIGlmIChUUkVFX0NPREUg KFRSRUVfVFlQRSAoZXhwcikpID09IElOVEVHRVJfVFlQRSkKICAgICAgICAg ICAgewogICAgICAgICAgICAgIFJFQUxfVkFMVUVfVFlQRSBhID0gcmVhbF92 YWx1ZV9mcm9tX2ludF9jc3QgKDAsIGV4cHIpOwogICAgICAgICAgICAgIGlm ICghZXhhY3RfcmVhbF90cnVuY2F0ZSAoVFlQRV9NT0RFICh0eXBlKSwgJmEp KQogICAgICAgICAgICAgICAgZ2l2ZV93YXJuaW5nID0gdHJ1ZTsKICAgICAg ICAgICAgfQogICAgICAgICAgLyogV2FybiBmb3IgYSByZWFsIGNvbnN0YW50 IHRoYXQgZG9lcyBub3QgZml0IGludG8gYSBzbWFsbGVyCiAgICAgICAgICAg ICByZWFsIHR5cGUuICAqLwogICAgICAgICAgZWxzZSBpZiAoVFJFRV9DT0RF IChUUkVFX1RZUEUgKGV4cHIpKSA9PSBSRUFMX1RZUEUKICAgICAgICAgICAg ICAgICAgICYmIGZvcm1hbF9wcmVjIDwgVFlQRV9QUkVDSVNJT04gKFRSRUVf VFlQRSAoZXhwcikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgUkVB TF9WQUxVRV9UWVBFIGEgPSBUUkVFX1JFQUxfQ1NUIChleHByKTsKICAgICAg ICAgICAgICBpZiAoIWV4YWN0X3JlYWxfdHJ1bmNhdGUgKFRZUEVfTU9ERSAo dHlwZSksICZhKSkKICAgICAgICAgICAgICAgIGdpdmVfd2FybmluZyA9IHRy dWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICBpZiAoZ2l2ZV93 YXJuaW5nKQogICAgICAgIHdhcm5pbmcgKE9QVF9XY29udmVyc2lvbiwKICAg ICAgICAgICAgICAgICAiY29udmVyc2lvbiB0byAlcVQgYWx0ZXJzICVxVCBj b25zdGFudCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgdHlwZSwgVFJFRV9U WVBFIChleHByKSk7CiAgICB9CiAgZWxzZSAvKiAnZXhwcicgaXMgbm90IGEg Y29uc3RhbnQuICAqLwogICAgewogICAgICAvKiBXYXJuIGZvciByZWFsIHR5 cGVzIGNvbnZlcnRlZCB0byBpbnRlZ2VyIHR5cGVzLiAgKi8KICAgICAgaWYg KFRSRUVfQ09ERSAoVFJFRV9UWVBFIChleHByKSkgPT0gUkVBTF9UWVBFCiAg ICAgICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IElOVEVHRVJfVFlQRSkK ICAgICAgICBnaXZlX3dhcm5pbmcgPSB0cnVlOwoKICAgICAgZWxzZSBpZiAo VFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBJTlRFR0VSX1RZUEUK ICAgICAgICAgICAgICAgJiYgVFJFRV9DT0RFICh0eXBlKSA9PSBJTlRFR0VS X1RZUEUpCiAgICAgICAgewoJICAvKiBEb24ndCB3YXJuIGFib3V0IHVuc2ln bmVkIGNoYXIgeSA9IDB4ZmYsIHggPSAoaW50KSB5OyAgKi8KCSAgZXhwciA9 IGdldF91bndpZGVuZWQgKGV4cHIsIDApOwoKICAgICAgICAgIC8qIFdhcm4g Zm9yIGludGVnZXIgdHlwZXMgY29udmVydGVkIHRvIHNtYWxsZXIgaW50ZWdl ciB0eXBlcy4gICovCiAgICAgICAgICBpZiAoZm9ybWFsX3ByZWMgPCBUWVBF X1BSRUNJU0lPTiAoVFJFRV9UWVBFIChleHByKSkpIAoJICAgIGdpdmVfd2Fy bmluZyA9IHRydWU7CgoJICAvKiBXaGVuIHRoZXkgYXJlIHRoZSBzYW1lIHdp ZHRoIGJ1dCBkaWZmZXJlbnQgc2lnbmVkbmVzcywKCSAgICAgdGhlbiB0aGUg dmFsdWUgbWF5IGNoYW5nZS4gICovCgkgIGVsc2UgaWYgKChmb3JtYWxfcHJl YyA9PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChleHByKSkKCQkgICAg JiYgVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChleHByKSkgIT0gVFlQRV9V TlNJR05FRCAodHlwZSkpCgkJICAgLyogRXZlbiB3aGVuIGNvbnZlcnRlZCB0 byBhIGJpZ2dlciB0eXBlLCBpZiB0aGUgdHlwZSBpcwoJCSAgICAgIHVuc2ln bmVkIGJ1dCBleHByIGlzIHNpZ25lZCwgdGhlbiBuZWdhdGl2ZSB2YWx1ZXMK CQkgICAgICB3aWxsIGJlIGNoYW5nZWQuICAqLwoJCSAgIHx8IChUWVBFX1VO U0lHTkVEICh0eXBlKSAmJiAhVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChl eHByKSkpKQoJICAgIHdhcm5pbmcgKE9QVF9Xc2lnbl9jb252ZXJzaW9uLAoJ CSAgICAgImNvbnZlcnNpb24gdG8gJXFUIGZyb20gJXFUIG1heSBjaGFuZ2Ug dGhlIHNpZ24gb2YgdGhlIHJlc3VsdCIsCgkJICAgICB0eXBlLCBUUkVFX1RZ UEUgKGV4cHIpKTsKICAgICAgICB9CgogICAgICAvKiBXYXJuIGZvciBpbnRl Z2VyIHR5cGVzIGNvbnZlcnRlZCB0byByZWFsIHR5cGVzIGlmIGFuZCBvbmx5 IGlmCiAgICAgICAgIGFsbCB0aGUgcmFuZ2Ugb2YgdmFsdWVzIG9mIHRoZSBp bnRlZ2VyIHR5cGUgY2Fubm90IGJlCiAgICAgICAgIHJlcHJlc2VudGVkIGJ5 IHRoZSByZWFsIHR5cGUuICAqLwogICAgICBlbHNlIGlmIChUUkVFX0NPREUg KFRSRUVfVFlQRSAoZXhwcikpID09IElOVEVHRVJfVFlQRQogICAgICAgICAg ICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IFJFQUxfVFlQRSkKICAgICAg ICB7CiAgICAgICAgICB0cmVlIHR5cGVfbG93X2JvdW5kID0gVFlQRV9NSU5f VkFMVUUgKFRSRUVfVFlQRSAoZXhwcikpOwogICAgICAgICAgdHJlZSB0eXBl X2hpZ2hfYm91bmQgPSBUWVBFX01BWF9WQUxVRSAoVFJFRV9UWVBFIChleHBy KSk7CiAgICAgICAgICBSRUFMX1ZBTFVFX1RZUEUgcmVhbF9sb3dfYm91bmQg PSByZWFsX3ZhbHVlX2Zyb21faW50X2NzdCAoMCwgdHlwZV9sb3dfYm91bmQp OwogICAgICAgICAgUkVBTF9WQUxVRV9UWVBFIHJlYWxfaGlnaF9ib3VuZCA9 IHJlYWxfdmFsdWVfZnJvbV9pbnRfY3N0ICgwLCB0eXBlX2hpZ2hfYm91bmQp OwoKICAgICAgICAgIGlmICghZXhhY3RfcmVhbF90cnVuY2F0ZSAoVFlQRV9N T0RFICh0eXBlKSwgJnJlYWxfbG93X2JvdW5kKQogICAgICAgICAgICAgIHx8 ICFleGFjdF9yZWFsX3RydW5jYXRlIChUWVBFX01PREUgKHR5cGUpLCAmcmVh bF9oaWdoX2JvdW5kKSkKICAgICAgICAgICAgZ2l2ZV93YXJuaW5nID0gdHJ1 ZTsKICAgICAgICB9CgogICAgICAvKiBXYXJuIGZvciByZWFsIHR5cGVzIGNv bnZlcnRlZCB0byBzbWFsbGVyIHJlYWwgdHlwZXMuICAqLwogICAgICBlbHNl IGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAoZXhwcikpID09IFJFQUxfVFlQ RQogICAgICAgICAgICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IFJFQUxf VFlQRQogICAgICAgICAgICAgICAmJiBmb3JtYWxfcHJlYyA8IFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKSkKICAgICAgICBnaXZlX3dhcm5p bmcgPSB0cnVlOwoKCiAgICAgIGlmIChnaXZlX3dhcm5pbmcpCiAgICAgICAg d2FybmluZyAoT1BUX1djb252ZXJzaW9uLAogICAgICAgICAgICAgICAgICJj b252ZXJzaW9uIHRvICVxVCBmcm9tICVxVCBtYXkgYWx0ZXIgaXRzIHZhbHVl IiwKICAgICAgICAgICAgICAgICB0eXBlLCBUUkVFX1RZUEUgKGV4cHIpKTsK ICAgIH0KfQoKLyogUHJvZHVjZSB3YXJuaW5ncyBhZnRlciBhIGNvbnZlcnNp b24uIFJFU1VMVCBpcyB0aGUgcmVzdWx0IG9mCiAgIGNvbnZlcnRpbmcgRVhQ UiB0byBUWVBFLiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IKICAg Y29udmVydF9hbmRfY2hlY2sgYW5kIGNwX2NvbnZlcnRfYW5kX2NoZWNrLiAg Ki8KCnZvaWQKd2FybmluZ3NfZm9yX2NvbnZlcnRfYW5kX2NoZWNrICh0cmVl IHR5cGUsIHRyZWUgZXhwciwgdHJlZSByZXN1bHQpCnsKICBpZiAoVFJFRV9D T0RFIChleHByKSA9PSBJTlRFR0VSX0NTVAogICAgICAmJiAoVFJFRV9DT0RF ICh0eXBlKSA9PSBJTlRFR0VSX1RZUEUKICAgICAgICAgIHx8IFRSRUVfQ09E RSAodHlwZSkgPT0gRU5VTUVSQUxfVFlQRSkKICAgICAgJiYgIWludF9maXRz X3R5cGVfcCAoZXhwciwgdHlwZSkpCiAgICB7CiAgICAgIC8qIERvIG5vdCBk aWFnbm9zZSBvdmVyZmxvdyBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gbWVy ZWx5CiAgICAgICAgIGJlY2F1c2UgYSBjb252ZXJzaW9uIG92ZXJmbG93ZWQu ICAqLwogICAgICBpZiAoVFJFRV9PVkVSRkxPVyAocmVzdWx0KSkKICAgICAg ICBUUkVFX09WRVJGTE9XIChyZXN1bHQpID0gVFJFRV9PVkVSRkxPVyAoZXhw cik7CgogICAgICBpZiAoVFlQRV9VTlNJR05FRCAodHlwZSkpCiAgICAgICAg ewogICAgICAgICAgLyogVGhpcyBkZXRlY3RzIGNhc2VzIGxpa2UgY29udmVy dGluZyAtMTI5IG9yIDI1NiB0bwogICAgICAgICAgICAgdW5zaWduZWQgY2hh ci4gICovCiAgICAgICAgICBpZiAoIWludF9maXRzX3R5cGVfcCAoZXhwciwg Y19jb21tb25fc2lnbmVkX3R5cGUgKHR5cGUpKSkKICAgICAgICAgICAgd2Fy bmluZyAoT1BUX1dvdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgImxh cmdlIGludGVnZXIgaW1wbGljaXRseSB0cnVuY2F0ZWQgdG8gdW5zaWduZWQg dHlwZSIpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBjb252ZXJzaW9u X3dhcm5pbmcgKHR5cGUsIGV4cHIpOwogICAgICAgIH0KICAgICAgZWxzZSBp ZiAoIWludF9maXRzX3R5cGVfcCAoZXhwciwgY19jb21tb25fdW5zaWduZWRf dHlwZSAodHlwZSkpKSAKCXdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csCgkJICJv dmVyZmxvdyBpbiBpbXBsaWNpdCBjb25zdGFudCBjb252ZXJzaW9uIik7CiAg ICAgIC8qIE5vIHdhcm5pbmcgZm9yIGNvbnZlcnRpbmcgMHg4MDAwMDAwMCB0 byBpbnQuICAqLwogICAgICBlbHNlIGlmIChwZWRhbnRpYwoJICAgICAgICYm IChUUkVFX0NPREUgKFRSRUVfVFlQRSAoZXhwcikpICE9IElOVEVHRVJfVFlQ RQoJCSAgIHx8IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKQoJ CSAgICE9IFRZUEVfUFJFQ0lTSU9OICh0eXBlKSkpCgl3YXJuaW5nIChPUFRf V292ZXJmbG93LAoJCSAib3ZlcmZsb3cgaW4gaW1wbGljaXQgY29uc3RhbnQg Y29udmVyc2lvbiIpOwoKICAgICAgZWxzZQoJY29udmVyc2lvbl93YXJuaW5n ICh0eXBlLCBleHByKTsKICAgIH0KICBlbHNlIGlmICgoVFJFRV9DT0RFIChy ZXN1bHQpID09IElOVEVHRVJfQ1NUCgkgICAgfHwgVFJFRV9DT0RFIChyZXN1 bHQpID09IEZJWEVEX0NTVCkgJiYgVFJFRV9PVkVSRkxPVyAocmVzdWx0KSkK ICAgIHdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csCiAgICAgICAgICAgICAib3Zl cmZsb3cgaW4gaW1wbGljaXQgY29uc3RhbnQgY29udmVyc2lvbiIpOwogIGVs c2UKICAgIGNvbnZlcnNpb25fd2FybmluZyAodHlwZSwgZXhwcik7Cn0KCgov KiBDb252ZXJ0IEVYUFIgdG8gVFlQRSwgd2FybmluZyBhYm91dCBjb252ZXJz aW9uIHByb2JsZW1zIHdpdGggY29uc3RhbnRzLgogICBJbnZva2UgdGhpcyBm dW5jdGlvbiBvbiBldmVyeSBleHByZXNzaW9uIHRoYXQgaXMgY29udmVydGVk IGltcGxpY2l0bHksCiAgIGkuZS4gYmVjYXVzZSBvZiBsYW5ndWFnZSBydWxl cyBhbmQgbm90IGJlY2F1c2Ugb2YgYW4gZXhwbGljaXQgY2FzdC4gICovCgp0 cmVlCmNvbnZlcnRfYW5kX2NoZWNrICh0cmVlIHR5cGUsIHRyZWUgZXhwcikK ewogIHRyZWUgcmVzdWx0OwoKICBpZiAoVFJFRV9UWVBFIChleHByKSA9PSB0 eXBlKQogICAgcmV0dXJuIGV4cHI7CiAgCiAgcmVzdWx0ID0gY29udmVydCAo dHlwZSwgZXhwcik7CgogIGlmICghc2tpcF9ldmFsdWF0aW9uICYmICFUUkVF X09WRVJGTE9XX1AgKGV4cHIpICYmIHJlc3VsdCAhPSBlcnJvcl9tYXJrX25v ZGUpCiAgICB3YXJuaW5nc19mb3JfY29udmVydF9hbmRfY2hlY2sgKHR5cGUs IGV4cHIsIHJlc3VsdCk7CgogIHJldHVybiByZXN1bHQ7Cn0KDAovKiBBIG5v ZGUgaW4gYSBsaXN0IHRoYXQgZGVzY3JpYmVzIHJlZmVyZW5jZXMgdG8gdmFy aWFibGVzIChFWFBSKSwgd2hpY2ggYXJlCiAgIGVpdGhlciByZWFkIGFjY2Vz c2VzIGlmIFdSSVRFUiBpcyB6ZXJvLCBvciB3cml0ZSBhY2Nlc3NlcywgaW4g d2hpY2ggY2FzZQogICBXUklURVIgaXMgdGhlIHBhcmVudCBvZiBFWFBSLiAg Ki8Kc3RydWN0IHRsaXN0CnsKICBzdHJ1Y3QgdGxpc3QgKm5leHQ7CiAgdHJl ZSBleHByLCB3cml0ZXI7Cn07CgovKiBVc2VkIHRvIGltcGxlbWVudCBhIGNh Y2hlIHRoZSByZXN1bHRzIG9mIGEgY2FsbCB0byB2ZXJpZnlfdHJlZS4gIFdl IG9ubHkKICAgdXNlIHRoaXMgZm9yIFNBVkVfRVhQUnMuICAqLwpzdHJ1Y3Qg dGxpc3RfY2FjaGUKewogIHN0cnVjdCB0bGlzdF9jYWNoZSAqbmV4dDsKICBz dHJ1Y3QgdGxpc3QgKmNhY2hlX2JlZm9yZV9zcDsKICBzdHJ1Y3QgdGxpc3Qg KmNhY2hlX2FmdGVyX3NwOwogIHRyZWUgZXhwcjsKfTsKCi8qIE9ic3RhY2sg dG8gdXNlIHdoZW4gYWxsb2NhdGluZyB0bGlzdCBzdHJ1Y3R1cmVzLCBhbmQg Y29ycmVzcG9uZGluZwogICBmaXJzdG9iai4gICovCnN0YXRpYyBzdHJ1Y3Qg b2JzdGFjayB0bGlzdF9vYnN0YWNrOwpzdGF0aWMgY2hhciAqdGxpc3RfZmly c3RvYmogPSAwOwoKLyogS2VlcCB0cmFjayBvZiB0aGUgaWRlbnRpZmllcnMg d2UndmUgd2FybmVkIGFib3V0LCBzbyB3ZSBjYW4gYXZvaWQgZHVwbGljYXRl CiAgIHdhcm5pbmdzLiAgKi8Kc3RhdGljIHN0cnVjdCB0bGlzdCAqd2FybmVk X2lkczsKLyogU0FWRV9FWFBScyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50LiAg V2UgcHJvY2VzcyB0aGVtIG9ubHkgb25jZSBhbmQgdGhlbgogICBjYWNoZSB0 aGUgcmVzdWx0cy4gICovCnN0YXRpYyBzdHJ1Y3QgdGxpc3RfY2FjaGUgKnNh dmVfZXhwcl9jYWNoZTsKCnN0YXRpYyB2b2lkIGFkZF90bGlzdCAoc3RydWN0 IHRsaXN0ICoqLCBzdHJ1Y3QgdGxpc3QgKiwgdHJlZSwgaW50KTsKc3RhdGlj IHZvaWQgbWVyZ2VfdGxpc3QgKHN0cnVjdCB0bGlzdCAqKiwgc3RydWN0IHRs aXN0ICosIGludCk7CnN0YXRpYyB2b2lkIHZlcmlmeV90cmVlICh0cmVlLCBz dHJ1Y3QgdGxpc3QgKiosIHN0cnVjdCB0bGlzdCAqKiwgdHJlZSk7CnN0YXRp YyBpbnQgd2FybmluZ19jYW5kaWRhdGVfcCAodHJlZSk7CnN0YXRpYyB2b2lk IHdhcm5fZm9yX2NvbGxpc2lvbnMgKHN0cnVjdCB0bGlzdCAqKTsKc3RhdGlj IHZvaWQgd2Fybl9mb3JfY29sbGlzaW9uc18xICh0cmVlLCB0cmVlLCBzdHJ1 Y3QgdGxpc3QgKiwgaW50KTsKc3RhdGljIHN0cnVjdCB0bGlzdCAqbmV3X3Rs aXN0IChzdHJ1Y3QgdGxpc3QgKiwgdHJlZSwgdHJlZSk7CgovKiBDcmVhdGUg YSBuZXcgc3RydWN0IHRsaXN0IGFuZCBmaWxsIGluIGl0cyBmaWVsZHMuICAq LwpzdGF0aWMgc3RydWN0IHRsaXN0ICoKbmV3X3RsaXN0IChzdHJ1Y3QgdGxp c3QgKm5leHQsIHRyZWUgdCwgdHJlZSB3cml0ZXIpCnsKICBzdHJ1Y3QgdGxp c3QgKmw7CiAgbCA9IFhPQk5FVyAoJnRsaXN0X29ic3RhY2ssIHN0cnVjdCB0 bGlzdCk7CiAgbC0+bmV4dCA9IG5leHQ7CiAgbC0+ZXhwciA9IHQ7CiAgbC0+ d3JpdGVyID0gd3JpdGVyOwogIHJldHVybiBsOwp9CgovKiBBZGQgZHVwbGlj YXRlcyBvZiB0aGUgbm9kZXMgZm91bmQgaW4gQUREIHRvIHRoZSBsaXN0ICpU Ty4gIElmIEVYQ0xVREVfV1JJVEVSCiAgIGlzIG5vbm51bGwsIHdlIGlnbm9y ZSBhbnkgbm9kZSB3ZSBmaW5kIHdoaWNoIGhhcyBhIHdyaXRlciBlcXVhbCB0 byBpdC4gICovCgpzdGF0aWMgdm9pZAphZGRfdGxpc3QgKHN0cnVjdCB0bGlz dCAqKnRvLCBzdHJ1Y3QgdGxpc3QgKmFkZCwgdHJlZSBleGNsdWRlX3dyaXRl ciwgaW50IGNvcHkpCnsKICB3aGlsZSAoYWRkKQogICAgewogICAgICBzdHJ1 Y3QgdGxpc3QgKm5leHQgPSBhZGQtPm5leHQ7CiAgICAgIGlmICghY29weSkK CWFkZC0+bmV4dCA9ICp0bzsKICAgICAgaWYgKCFleGNsdWRlX3dyaXRlciB8 fCBhZGQtPndyaXRlciAhPSBleGNsdWRlX3dyaXRlcikKCSp0byA9IGNvcHkg PyBuZXdfdGxpc3QgKCp0bywgYWRkLT5leHByLCBhZGQtPndyaXRlcikgOiBh ZGQ7CiAgICAgIGFkZCA9IG5leHQ7CiAgICB9Cn0KCi8qIE1lcmdlIHRoZSBu b2RlcyBvZiBBREQgaW50byBUTy4gIFRoaXMgbWVyZ2luZyBwcm9jZXNzIGlz IGRvbmUgc28gdGhhdCBmb3IKICAgZWFjaCB2YXJpYWJsZSB0aGF0IGFscmVh ZHkgZXhpc3RzIGluIFRPLCBubyBuZXcgbm9kZSBpcyBhZGRlZDsgaG93ZXZl ciBpZgogICB0aGVyZSBpcyBhIHdyaXRlIGFjY2VzcyByZWNvcmRlZCBpbiBB REQsIGFuZCBhbiBvY2N1cnJlbmNlIG9uIFRPIGlzIG9ubHkKICAgYSByZWFk IGFjY2VzcywgdGhlbiB0aGUgb2NjdXJyZW5jZSBpbiBUTyB3aWxsIGJlIG1v ZGlmaWVkIHRvIHJlY29yZCB0aGUKICAgd3JpdGUuICAqLwoKc3RhdGljIHZv aWQKbWVyZ2VfdGxpc3QgKHN0cnVjdCB0bGlzdCAqKnRvLCBzdHJ1Y3QgdGxp c3QgKmFkZCwgaW50IGNvcHkpCnsKICBzdHJ1Y3QgdGxpc3QgKiplbmQgPSB0 bzsKCiAgd2hpbGUgKCplbmQpCiAgICBlbmQgPSAmKCplbmQpLT5uZXh0OwoK ICB3aGlsZSAoYWRkKQogICAgewogICAgICBpbnQgZm91bmQgPSAwOwogICAg ICBzdHJ1Y3QgdGxpc3QgKnRtcDI7CiAgICAgIHN0cnVjdCB0bGlzdCAqbmV4 dCA9IGFkZC0+bmV4dDsKCiAgICAgIGZvciAodG1wMiA9ICp0bzsgdG1wMjsg dG1wMiA9IHRtcDItPm5leHQpCglpZiAodG1wMi0+ZXhwciA9PSBhZGQtPmV4 cHIpCgkgIHsKCSAgICBmb3VuZCA9IDE7CgkgICAgaWYgKCF0bXAyLT53cml0 ZXIpCgkgICAgICB0bXAyLT53cml0ZXIgPSBhZGQtPndyaXRlcjsKCSAgfQog ICAgICBpZiAoIWZvdW5kKQoJewoJICAqZW5kID0gY29weSA/IGFkZCA6IG5l d190bGlzdCAoTlVMTCwgYWRkLT5leHByLCBhZGQtPndyaXRlcik7CgkgIGVu ZCA9ICYoKmVuZCktPm5leHQ7CgkgICplbmQgPSAwOwoJfQogICAgICBhZGQg PSBuZXh0OwogICAgfQp9CgovKiBXUklUVEVOIGlzIGEgdmFyaWFibGUsIFdS SVRFUiBpcyBpdHMgcGFyZW50LiAgV2FybiBpZiBhbnkgb2YgdGhlIHZhcmlh YmxlCiAgIHJlZmVyZW5jZXMgaW4gbGlzdCBMSVNUIGNvbmZsaWN0IHdpdGgg aXQsIGV4Y2x1ZGluZyByZWFkcyBpZiBPTkxZIHdyaXRlcnMKICAgaXMgbm9u emVyby4gICovCgpzdGF0aWMgdm9pZAp3YXJuX2Zvcl9jb2xsaXNpb25zXzEg KHRyZWUgd3JpdHRlbiwgdHJlZSB3cml0ZXIsIHN0cnVjdCB0bGlzdCAqbGlz dCwKCQkgICAgICAgaW50IG9ubHlfd3JpdGVzKQp7CiAgc3RydWN0IHRsaXN0 ICp0bXA7CgogIC8qIEF2b2lkIGR1cGxpY2F0ZSB3YXJuaW5ncy4gICovCiAg Zm9yICh0bXAgPSB3YXJuZWRfaWRzOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkK ICAgIGlmICh0bXAtPmV4cHIgPT0gd3JpdHRlbikKICAgICAgcmV0dXJuOwoK ICB3aGlsZSAobGlzdCkKICAgIHsKICAgICAgaWYgKGxpc3QtPmV4cHIgPT0g d3JpdHRlbgoJICAmJiBsaXN0LT53cml0ZXIgIT0gd3JpdGVyCgkgICYmICgh b25seV93cml0ZXMgfHwgbGlzdC0+d3JpdGVyKQoJICAmJiBERUNMX05BTUUg KGxpc3QtPmV4cHIpKQoJewoJICB3YXJuZWRfaWRzID0gbmV3X3RsaXN0ICh3 YXJuZWRfaWRzLCB3cml0dGVuLCBOVUxMX1RSRUUpOwoJICB3YXJuaW5nICgw LCAib3BlcmF0aW9uIG9uICVxRSBtYXkgYmUgdW5kZWZpbmVkIiwgbGlzdC0+ ZXhwcik7Cgl9CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQp9Cgov KiBHaXZlbiBhIGxpc3QgTElTVCBvZiByZWZlcmVuY2VzIHRvIHZhcmlhYmxl cywgZmluZCB3aGV0aGVyIGFueSBvZiB0aGVzZQogICBjYW4gY2F1c2UgY29u ZmxpY3RzIGR1ZSB0byBtaXNzaW5nIHNlcXVlbmNlIHBvaW50cy4gICovCgpz dGF0aWMgdm9pZAp3YXJuX2Zvcl9jb2xsaXNpb25zIChzdHJ1Y3QgdGxpc3Qg Kmxpc3QpCnsKICBzdHJ1Y3QgdGxpc3QgKnRtcDsKCiAgZm9yICh0bXAgPSBs aXN0OyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKICAgIHsKICAgICAgaWYgKHRt cC0+d3JpdGVyKQoJd2Fybl9mb3JfY29sbGlzaW9uc18xICh0bXAtPmV4cHIs IHRtcC0+d3JpdGVyLCBsaXN0LCAwKTsKICAgIH0KfQoKLyogUmV0dXJuIG5v bnplcm8gaWYgWCBpcyBhIHRyZWUgdGhhdCBjYW4gYmUgdmVyaWZpZWQgYnkg dGhlIHNlcXVlbmNlIHBvaW50CiAgIHdhcm5pbmdzLiAgKi8Kc3RhdGljIGlu dAp3YXJuaW5nX2NhbmRpZGF0ZV9wICh0cmVlIHgpCnsKICByZXR1cm4gVFJF RV9DT0RFICh4KSA9PSBWQVJfREVDTCB8fCBUUkVFX0NPREUgKHgpID09IFBB Uk1fREVDTDsKfQoKLyogV2FsayB0aGUgdHJlZSBYLCBhbmQgcmVjb3JkIGFj Y2Vzc2VzIHRvIHZhcmlhYmxlcy4gIElmIFggaXMgd3JpdHRlbiBieSB0aGUK ICAgcGFyZW50IHRyZWUsIFdSSVRFUiBpcyB0aGUgcGFyZW50LgogICBXZSBz dG9yZSBhY2Nlc3NlcyBpbiBvbmUgb2YgdGhlIHR3byBsaXN0czogUEJFRk9S RV9TUCwgYW5kIFBOT19TUC4gIElmIHRoaXMKICAgZXhwcmVzc2lvbiBvciBp dHMgb25seSBvcGVyYW5kIGZvcmNlcyBhIHNlcXVlbmNlIHBvaW50LCB0aGVu IGV2ZXJ5dGhpbmcgdXAKICAgdG8gdGhlIHNlcXVlbmNlIHBvaW50IGlzIHN0 b3JlZCBpbiBQQkVGT1JFX1NQLiAgRXZlcnl0aGluZyBlbHNlIGdldHMgc3Rv cmVkCiAgIGluIFBOT19TUC4KICAgT25jZSB3ZSByZXR1cm4sIHdlIHdpbGwg aGF2ZSBlbWl0dGVkIHdhcm5pbmdzIGlmIGFueSBzdWJleHByZXNzaW9uIGJl Zm9yZQogICBzdWNoIGEgc2VxdWVuY2UgcG9pbnQgY291bGQgYmUgdW5kZWZp bmVkLiAgT24gYSBoaWdoZXIgbGV2ZWwsIGhvd2V2ZXIsIHRoZQogICBzZXF1 ZW5jZSBwb2ludCBtYXkgbm90IGJlIHJlbGV2YW50LCBhbmQgd2UnbGwgbWVy Z2UgdGhlIHR3byBsaXN0cy4KCiAgIEV4YW1wbGU6IChiKyssIGEpICsgYjsK ICAgVGhlIGNhbGwgdGhhdCBwcm9jZXNzZXMgdGhlIENPTVBPVU5EX0VYUFIg d2lsbCBzdG9yZSB0aGUgaW5jcmVtZW50IG9mIEIKICAgaW4gUEJFRk9SRV9T UCwgYW5kIHRoZSB1c2Ugb2YgQSBpbiBQTk9fU1AuICBUaGUgaGlnaGVyLWxl dmVsIGNhbGwgdGhhdAogICBwcm9jZXNzZXMgdGhlIFBMVVNfRVhQUiB3aWxs IG5lZWQgdG8gbWVyZ2UgdGhlIHR3byBsaXN0cyBzbyB0aGF0CiAgIGV2ZW50 dWFsbHksIGFsbCBhY2Nlc3NlcyBlbmQgdXAgb24gdGhlIHNhbWUgbGlzdCAo YW5kIHdlJ2xsIHdhcm4gYWJvdXQgdGhlCiAgIHVub3JkZXJlZCBzdWJleHBy ZXNzaW9ucyBiKysgYW5kIGIuCgogICBBIG5vdGUgb24gbWVyZ2luZy4gIElm IHdlIG1vZGlmeSB0aGUgZm9ybWVyIGV4YW1wbGUgc28gdGhhdCBvdXIgZXhw cmVzc2lvbgogICBiZWNvbWVzCiAgICAgKGIrKywgYikgKyBhCiAgIGNhcmUg bXVzdCBiZSB0YWtlbiBub3Qgc2ltcGx5IHRvIGFkZCBhbGwgdGhyZWUgZXhw cmVzc2lvbnMgaW50byB0aGUgZmluYWwKICAgUE5PX1NQIGxpc3QuICBUaGUg ZnVuY3Rpb24gbWVyZ2VfdGxpc3QgdGFrZXMgY2FyZSBvZiB0aGF0IGJ5IG1l cmdpbmcgdGhlCiAgIGJlZm9yZS1TUCBsaXN0IG9mIHRoZSBDT01QT1VORF9F WFBSIGludG8gaXRzIGFmdGVyLVNQIGxpc3QgaW4gYSBzcGVjaWFsCiAgIHdh eSwgc28gdGhhdCBubyBtb3JlIHRoYW4gb25lIGFjY2VzcyB0byBCIGlzIHJl Y29yZGVkLiAgKi8KCnN0YXRpYyB2b2lkCnZlcmlmeV90cmVlICh0cmVlIHgs IHN0cnVjdCB0bGlzdCAqKnBiZWZvcmVfc3AsIHN0cnVjdCB0bGlzdCAqKnBu b19zcCwKCSAgICAgdHJlZSB3cml0ZXIpCnsKICBzdHJ1Y3QgdGxpc3QgKnRt cF9iZWZvcmUsICp0bXBfbm9zcCwgKnRtcF9saXN0MiwgKnRtcF9saXN0MzsK ICBlbnVtIHRyZWVfY29kZSBjb2RlOwogIGVudW0gdHJlZV9jb2RlX2NsYXNz IGNsOwoKICAvKiBYIG1heSBiZSBOVUxMIGlmIGl0IGlzIHRoZSBvcGVyYW5k IG9mIGFuIGVtcHR5IHN0YXRlbWVudCBleHByZXNzaW9uCiAgICAgKHsgfSku ICAqLwogIGlmICh4ID09IE5VTEwpCiAgICByZXR1cm47CgogcmVzdGFydDoK ICBjb2RlID0gVFJFRV9DT0RFICh4KTsKICBjbCA9IFRSRUVfQ09ERV9DTEFT UyAoY29kZSk7CgogIGlmICh3YXJuaW5nX2NhbmRpZGF0ZV9wICh4KSkKICAg IHsKICAgICAgKnBub19zcCA9IG5ld190bGlzdCAoKnBub19zcCwgeCwgd3Jp dGVyKTsKICAgICAgcmV0dXJuOwogICAgfQoKICBzd2l0Y2ggKGNvZGUpCiAg ICB7CiAgICBjYXNlIENPTlNUUlVDVE9SOgogICAgICByZXR1cm47CgogICAg Y2FzZSBDT01QT1VORF9FWFBSOgogICAgY2FzZSBUUlVUSF9BTkRJRl9FWFBS OgogICAgY2FzZSBUUlVUSF9PUklGX0VYUFI6CiAgICAgIHRtcF9iZWZvcmUg PSB0bXBfbm9zcCA9IHRtcF9saXN0MyA9IDA7CiAgICAgIHZlcmlmeV90cmVl IChUUkVFX09QRVJBTkQgKHgsIDApLCAmdG1wX2JlZm9yZSwgJnRtcF9ub3Nw LCBOVUxMX1RSRUUpOwogICAgICB3YXJuX2Zvcl9jb2xsaXNpb25zICh0bXBf bm9zcCk7CiAgICAgIG1lcmdlX3RsaXN0IChwYmVmb3JlX3NwLCB0bXBfYmVm b3JlLCAwKTsKICAgICAgbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9u b3NwLCAwKTsKICAgICAgdmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwg MSksICZ0bXBfbGlzdDMsIHBub19zcCwgTlVMTF9UUkVFKTsKICAgICAgbWVy Z2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9saXN0MywgMCk7CiAgICAgIHJl dHVybjsKCiAgICBjYXNlIENPTkRfRVhQUjoKICAgICAgdG1wX2JlZm9yZSA9 IHRtcF9saXN0MiA9IDA7CiAgICAgIHZlcmlmeV90cmVlIChUUkVFX09QRVJB TkQgKHgsIDApLCAmdG1wX2JlZm9yZSwgJnRtcF9saXN0MiwgTlVMTF9UUkVF KTsKICAgICAgd2Fybl9mb3JfY29sbGlzaW9ucyAodG1wX2xpc3QyKTsKICAg ICAgbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9iZWZvcmUsIDApOwog ICAgICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1wX2xpc3QyLCAxKTsK CiAgICAgIHRtcF9saXN0MyA9IHRtcF9ub3NwID0gMDsKICAgICAgdmVyaWZ5 X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgMSksICZ0bXBfbGlzdDMsICZ0bXBf bm9zcCwgTlVMTF9UUkVFKTsKICAgICAgd2Fybl9mb3JfY29sbGlzaW9ucyAo dG1wX25vc3ApOwogICAgICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1w X2xpc3QzLCAwKTsKCiAgICAgIHRtcF9saXN0MyA9IHRtcF9saXN0MiA9IDA7 CiAgICAgIHZlcmlmeV90cmVlIChUUkVFX09QRVJBTkQgKHgsIDIpLCAmdG1w X2xpc3QzLCAmdG1wX2xpc3QyLCBOVUxMX1RSRUUpOwogICAgICB3YXJuX2Zv cl9jb2xsaXNpb25zICh0bXBfbGlzdDIpOwogICAgICBtZXJnZV90bGlzdCAo cGJlZm9yZV9zcCwgdG1wX2xpc3QzLCAwKTsKICAgICAgLyogUmF0aGVyIHRo YW4gYWRkIGJvdGggdG1wX25vc3AgYW5kIHRtcF9saXN0Miwgd2UgaGF2ZSB0 byBtZXJnZSB0aGUKCSB0d28gZmlyc3QsIHRvIGF2b2lkIHdhcm5pbmcgZm9y IChhID8gYisrIDogYisrKS4gICovCiAgICAgIG1lcmdlX3RsaXN0ICgmdG1w X25vc3AsIHRtcF9saXN0MiwgMCk7CiAgICAgIGFkZF90bGlzdCAocG5vX3Nw LCB0bXBfbm9zcCwgTlVMTF9UUkVFLCAwKTsKICAgICAgcmV0dXJuOwoKICAg IGNhc2UgUFJFREVDUkVNRU5UX0VYUFI6CiAgICBjYXNlIFBSRUlOQ1JFTUVO VF9FWFBSOgogICAgY2FzZSBQT1NUREVDUkVNRU5UX0VYUFI6CiAgICBjYXNl IFBPU1RJTkNSRU1FTlRfRVhQUjoKICAgICAgdmVyaWZ5X3RyZWUgKFRSRUVf T1BFUkFORCAoeCwgMCksIHBub19zcCwgcG5vX3NwLCB4KTsKICAgICAgcmV0 dXJuOwoKICAgIGNhc2UgTU9ESUZZX0VYUFI6CiAgICAgIHRtcF9iZWZvcmUg PSB0bXBfbm9zcCA9IHRtcF9saXN0MyA9IDA7CiAgICAgIHZlcmlmeV90cmVl IChUUkVFX09QRVJBTkQgKHgsIDEpLCAmdG1wX2JlZm9yZSwgJnRtcF9ub3Nw LCBOVUxMX1RSRUUpOwogICAgICB2ZXJpZnlfdHJlZSAoVFJFRV9PUEVSQU5E ICh4LCAwKSwgJnRtcF9saXN0MywgJnRtcF9saXN0MywgeCk7CiAgICAgIC8q IEV4cHJlc3Npb25zIGluc2lkZSB0aGUgTEhTIGFyZSBub3Qgb3JkZXJlZCB3 cnQuIHRoZSBzZXF1ZW5jZSBwb2ludHMKCSBpbiB0aGUgUkhTLiAgRXhhbXBs ZToKCSAgICphID0gKGErKywgMikKCSBEZXNwaXRlIHRoZSBmYWN0IHRoYXQg dGhlIG1vZGlmaWNhdGlvbiBvZiAiYSIgaXMgaW4gdGhlIGJlZm9yZV9zcAoJ IGxpc3QgKHRtcF9iZWZvcmUpLCBpdCBjb25mbGljdHMgd2l0aCB0aGUgdXNl IG9mICJhIiBpbiB0aGUgTEhTLgoJIFdlIGNhbiBoYW5kbGUgdGhpcyBieSBh ZGRpbmcgdGhlIGNvbnRlbnRzIG9mIHRtcF9saXN0MwoJIHRvIHRob3NlIG9m IHRtcF9iZWZvcmUsIGFuZCByZWRvaW5nIHRoZSBjb2xsaXNpb24gd2Fybmlu Z3MgZm9yIHRoYXQKCSBsaXN0LiAgKi8KICAgICAgYWRkX3RsaXN0ICgmdG1w X2JlZm9yZSwgdG1wX2xpc3QzLCB4LCAxKTsKICAgICAgd2Fybl9mb3JfY29s bGlzaW9ucyAodG1wX2JlZm9yZSk7CiAgICAgIC8qIEV4Y2x1ZGUgdGhlIExI UyBpdHNlbGYgaGVyZTsgd2UgZmlyc3QgaGF2ZSB0byBtZXJnZSBpdCBpbnRv IHRoZQoJIHRtcF9ub3NwIGxpc3QuICBUaGlzIGlzIGRvbmUgdG8gYXZvaWQg d2FybmluZyBmb3IgImEgPSBhIjsgaWYgd2UKCSBkaWRuJ3QgZXhjbHVkZSB0 aGUgTEhTLCB3ZSdkIGdldCBpdCB0d2ljZSwgb25jZSBhcyBhIHJlYWQgYW5k IG9uY2UKCSBhcyBhIHdyaXRlLiAgKi8KICAgICAgYWRkX3RsaXN0IChwbm9f c3AsIHRtcF9saXN0MywgeCwgMCk7CiAgICAgIHdhcm5fZm9yX2NvbGxpc2lv bnNfMSAoVFJFRV9PUEVSQU5EICh4LCAwKSwgeCwgdG1wX25vc3AsIDEpOwoK ICAgICAgbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9iZWZvcmUsIDAp OwogICAgICBpZiAod2FybmluZ19jYW5kaWRhdGVfcCAoVFJFRV9PUEVSQU5E ICh4LCAwKSkpCgltZXJnZV90bGlzdCAoJnRtcF9ub3NwLCBuZXdfdGxpc3Qg KE5VTEwsIFRSRUVfT1BFUkFORCAoeCwgMCksIHgpLCAwKTsKICAgICAgYWRk X3RsaXN0IChwbm9fc3AsIHRtcF9ub3NwLCBOVUxMX1RSRUUsIDEpOwogICAg ICByZXR1cm47CgogICAgY2FzZSBDQUxMX0VYUFI6CiAgICAgIC8qIFdlIG5l ZWQgdG8gd2FybiBhYm91dCBjb25mbGljdHMgYW1vbmcgYXJndW1lbnRzIGFu ZCBjb25mbGljdHMgYmV0d2VlbgoJIGFyZ3MgYW5kIHRoZSBmdW5jdGlvbiBh ZGRyZXNzLiAgU2lkZSBlZmZlY3RzIG9mIHRoZSBmdW5jdGlvbiBhZGRyZXNz LAoJIGhvd2V2ZXIsIGFyZSBub3Qgb3JkZXJlZCBieSB0aGUgc2VxdWVuY2Ug cG9pbnQgb2YgdGhlIGNhbGwuICAqLwogICAgICB7CgljYWxsX2V4cHJfYXJn X2l0ZXJhdG9yIGl0ZXI7Cgl0cmVlIGFyZzsKCXRtcF9iZWZvcmUgPSB0bXBf bm9zcCA9IDA7IAoJdmVyaWZ5X3RyZWUgKENBTExfRVhQUl9GTiAoeCksICZ0 bXBfYmVmb3JlLCAmdG1wX25vc3AsIE5VTExfVFJFRSk7CglGT1JfRUFDSF9D QUxMX0VYUFJfQVJHIChhcmcsIGl0ZXIsIHgpCgkgIHsKCSAgICB0bXBfbGlz dDIgPSB0bXBfbGlzdDMgPSAwOwoJICAgIHZlcmlmeV90cmVlIChhcmcsICZ0 bXBfbGlzdDIsICZ0bXBfbGlzdDMsIE5VTExfVFJFRSk7CgkgICAgbWVyZ2Vf dGxpc3QgKCZ0bXBfbGlzdDMsIHRtcF9saXN0MiwgMCk7CgkgICAgYWRkX3Rs aXN0ICgmdG1wX2JlZm9yZSwgdG1wX2xpc3QzLCBOVUxMX1RSRUUsIDApOwoJ ICB9CglhZGRfdGxpc3QgKCZ0bXBfYmVmb3JlLCB0bXBfbm9zcCwgTlVMTF9U UkVFLCAwKTsKCXdhcm5fZm9yX2NvbGxpc2lvbnMgKHRtcF9iZWZvcmUpOwoJ YWRkX3RsaXN0IChwYmVmb3JlX3NwLCB0bXBfYmVmb3JlLCBOVUxMX1RSRUUs IDApOwoJcmV0dXJuOwogICAgICB9CgogICAgY2FzZSBUUkVFX0xJU1Q6CiAg ICAgIC8qIFNjYW4gYWxsIHRoZSBsaXN0LCBlLmcuIGluZGljZXMgb2YgbXVs dGkgZGltZW5zaW9uYWwgYXJyYXkuICAqLwogICAgICB3aGlsZSAoeCkKCXsK CSAgdG1wX2JlZm9yZSA9IHRtcF9ub3NwID0gMDsKCSAgdmVyaWZ5X3RyZWUg KFRSRUVfVkFMVUUgKHgpLCAmdG1wX2JlZm9yZSwgJnRtcF9ub3NwLCBOVUxM X1RSRUUpOwoJICBtZXJnZV90bGlzdCAoJnRtcF9ub3NwLCB0bXBfYmVmb3Jl LCAwKTsKCSAgYWRkX3RsaXN0IChwbm9fc3AsIHRtcF9ub3NwLCBOVUxMX1RS RUUsIDApOwoJICB4ID0gVFJFRV9DSEFJTiAoeCk7Cgl9CiAgICAgIHJldHVy bjsKCiAgICBjYXNlIFNBVkVfRVhQUjoKICAgICAgewoJc3RydWN0IHRsaXN0 X2NhY2hlICp0OwoJZm9yICh0ID0gc2F2ZV9leHByX2NhY2hlOyB0OyB0ID0g dC0+bmV4dCkKCSAgaWYgKHQtPmV4cHIgPT0geCkKCSAgICBicmVhazsKCglp ZiAoIXQpCgkgIHsKCSAgICB0ID0gWE9CTkVXICgmdGxpc3Rfb2JzdGFjaywg c3RydWN0IHRsaXN0X2NhY2hlKTsKCSAgICB0LT5uZXh0ID0gc2F2ZV9leHBy X2NhY2hlOwoJICAgIHQtPmV4cHIgPSB4OwoJICAgIHNhdmVfZXhwcl9jYWNo ZSA9IHQ7CgoJICAgIHRtcF9iZWZvcmUgPSB0bXBfbm9zcCA9IDA7CgkgICAg dmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgMCksICZ0bXBfYmVmb3Jl LCAmdG1wX25vc3AsIE5VTExfVFJFRSk7CgkgICAgd2Fybl9mb3JfY29sbGlz aW9ucyAodG1wX25vc3ApOwoKCSAgICB0bXBfbGlzdDMgPSAwOwoJICAgIHdo aWxlICh0bXBfbm9zcCkKCSAgICAgIHsKCQlzdHJ1Y3QgdGxpc3QgKnQgPSB0 bXBfbm9zcDsKCQl0bXBfbm9zcCA9IHQtPm5leHQ7CgkJbWVyZ2VfdGxpc3Qg KCZ0bXBfbGlzdDMsIHQsIDApOwoJICAgICAgfQoJICAgIHQtPmNhY2hlX2Jl Zm9yZV9zcCA9IHRtcF9iZWZvcmU7CgkgICAgdC0+Y2FjaGVfYWZ0ZXJfc3Ag PSB0bXBfbGlzdDM7CgkgIH0KCW1lcmdlX3RsaXN0IChwYmVmb3JlX3NwLCB0 LT5jYWNoZV9iZWZvcmVfc3AsIDEpOwoJYWRkX3RsaXN0IChwbm9fc3AsIHQt PmNhY2hlX2FmdGVyX3NwLCBOVUxMX1RSRUUsIDEpOwoJcmV0dXJuOwogICAg ICB9CgogICAgZGVmYXVsdDoKICAgICAgLyogRm9yIG90aGVyIGV4cHJlc3Np b25zLCBzaW1wbHkgcmVjdXJzZSBvbiB0aGVpciBvcGVyYW5kcy4KCSBNYW51 YWwgdGFpbCByZWN1cnNpb24gZm9yIHVuYXJ5IGV4cHJlc3Npb25zLgoJIE90 aGVyIG5vbi1leHByZXNzaW9ucyBuZWVkIG5vdCBiZSBwcm9jZXNzZWQuICAq LwogICAgICBpZiAoY2wgPT0gdGNjX3VuYXJ5KQoJewoJICB4ID0gVFJFRV9P UEVSQU5EICh4LCAwKTsKCSAgd3JpdGVyID0gMDsKCSAgZ290byByZXN0YXJ0 OwoJfQogICAgICBlbHNlIGlmIChJU19FWFBSX0NPREVfQ0xBU1MgKGNsKSkK CXsKCSAgaW50IGxwOwoJICBpbnQgbWF4ID0gVFJFRV9PUEVSQU5EX0xFTkdU SCAoeCk7CgkgIGZvciAobHAgPSAwOyBscCA8IG1heDsgbHArKykKCSAgICB7 CgkgICAgICB0bXBfYmVmb3JlID0gdG1wX25vc3AgPSAwOwoJICAgICAgdmVy aWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgbHApLCAmdG1wX2JlZm9yZSwg JnRtcF9ub3NwLCAwKTsKCSAgICAgIG1lcmdlX3RsaXN0ICgmdG1wX25vc3As IHRtcF9iZWZvcmUsIDApOwoJICAgICAgYWRkX3RsaXN0IChwbm9fc3AsIHRt cF9ub3NwLCBOVUxMX1RSRUUsIDApOwoJICAgIH0KCX0KICAgICAgcmV0dXJu OwogICAgfQp9CgovKiBUcnkgdG8gd2FybiBmb3IgdW5kZWZpbmVkIGJlaGF2 aW9yIGluIEVYUFIgZHVlIHRvIG1pc3Npbmcgc2VxdWVuY2UKICAgcG9pbnRz LiAgKi8KCnZvaWQKdmVyaWZ5X3NlcXVlbmNlX3BvaW50cyAodHJlZSBleHBy KQp7CiAgc3RydWN0IHRsaXN0ICpiZWZvcmVfc3AgPSAwLCAqYWZ0ZXJfc3Ag PSAwOwoKICB3YXJuZWRfaWRzID0gMDsKICBzYXZlX2V4cHJfY2FjaGUgPSAw OwogIGlmICh0bGlzdF9maXJzdG9iaiA9PSAwKQogICAgewogICAgICBnY2Nf b2JzdGFja19pbml0ICgmdGxpc3Rfb2JzdGFjayk7CiAgICAgIHRsaXN0X2Zp cnN0b2JqID0gKGNoYXIgKikgb2JzdGFja19hbGxvYyAoJnRsaXN0X29ic3Rh Y2ssIDApOwogICAgfQoKICB2ZXJpZnlfdHJlZSAoZXhwciwgJmJlZm9yZV9z cCwgJmFmdGVyX3NwLCAwKTsKICB3YXJuX2Zvcl9jb2xsaXNpb25zIChhZnRl cl9zcCk7CiAgb2JzdGFja19mcmVlICgmdGxpc3Rfb2JzdGFjaywgdGxpc3Rf Zmlyc3RvYmopOwp9CgwKLyogVmFsaWRhdGUgdGhlIGV4cHJlc3Npb24gYWZ0 ZXIgYGNhc2UnIGFuZCBhcHBseSBkZWZhdWx0IHByb21vdGlvbnMuICAqLwoK c3RhdGljIHRyZWUKY2hlY2tfY2FzZV92YWx1ZSAodHJlZSB2YWx1ZSkKewog IGlmICh2YWx1ZSA9PSBOVUxMX1RSRUUpCiAgICByZXR1cm4gdmFsdWU7Cgog IC8qID8/PyBDYW4gd2UgZXZlciBnZXQgbm9wcyBoZXJlIGZvciBhIHZhbGlk IGNhc2UgdmFsdWU/ICBXZQogICAgIHNob3VsZG4ndCBmb3IgQy4gICovCiAg U1RSSVBfVFlQRV9OT1BTICh2YWx1ZSk7CiAgLyogSW4gQysrLCB0aGUgZm9s bG93aW5nIGlzIGFsbG93ZWQ6CgogICAgICAgY29uc3QgaW50IGkgPSAzOwog ICAgICAgc3dpdGNoICguLi4pIHsgY2FzZSBpOiAuLi4gfQoKICAgICBTbywg d2UgdHJ5IHRvIHJlZHVjZSB0aGUgVkFMVUUgdG8gYSBjb25zdGFudCB0aGF0 IHdheS4gICovCiAgaWYgKGNfZGlhbGVjdF9jeHggKCkpCiAgICB7CiAgICAg IHZhbHVlID0gZGVjbF9jb25zdGFudF92YWx1ZSAodmFsdWUpOwogICAgICBT VFJJUF9UWVBFX05PUFMgKHZhbHVlKTsKICAgICAgdmFsdWUgPSBmb2xkICh2 YWx1ZSk7CiAgICB9CgogIGlmIChUUkVFX0NPREUgKHZhbHVlKSA9PSBJTlRF R0VSX0NTVCkKICAgIC8qIFByb21vdGUgY2hhciBvciBzaG9ydCB0byBpbnQu ICAqLwogICAgdmFsdWUgPSBwZXJmb3JtX2ludGVncmFsX3Byb21vdGlvbnMg KHZhbHVlKTsKICBlbHNlIGlmICh2YWx1ZSAhPSBlcnJvcl9tYXJrX25vZGUp CiAgICB7CiAgICAgIGVycm9yICgiY2FzZSBsYWJlbCBkb2VzIG5vdCByZWR1 Y2UgdG8gYW4gaW50ZWdlciBjb25zdGFudCIpOwogICAgICB2YWx1ZSA9IGVy cm9yX21hcmtfbm9kZTsKICAgIH0KCiAgY29uc3RhbnRfZXhwcmVzc2lvbl93 YXJuaW5nICh2YWx1ZSk7CgogIHJldHVybiB2YWx1ZTsKfQoMCi8qIFNlZSBp ZiB0aGUgY2FzZSB2YWx1ZXMgTE9XIGFuZCBISUdIIGFyZSBpbiB0aGUgcmFu Z2Ugb2YgdGhlIG9yaWdpbmFsCiAgIHR5cGUgKGkuZS4gYmVmb3JlIHRoZSBk ZWZhdWx0IGNvbnZlcnNpb24gdG8gaW50KSBvZiB0aGUgc3dpdGNoIHRlc3Rp bmcKICAgZXhwcmVzc2lvbi4KICAgVFlQRSBpcyB0aGUgcHJvbW90ZWQgdHlw ZSBvZiB0aGUgdGVzdGluZyBleHByZXNzaW9uLCBhbmQgT1JJR19UWVBFIGlz CiAgIHRoZSB0eXBlIGJlZm9yZSBwcm9tb3RpbmcgaXQuICBDQVNFX0xPV19Q IGlzIGEgcG9pbnRlciB0byB0aGUgbG93ZXIKICAgYm91bmQgb2YgdGhlIGNh c2UgbGFiZWwsIGFuZCBDQVNFX0hJR0hfUCBpcyB0aGUgdXBwZXIgYm91bmQg b3IgTlVMTAogICBpZiB0aGUgY2FzZSBpcyBub3QgYSBjYXNlIHJhbmdlLgog ICBUaGUgY2FsbGVyIGhhcyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90 IGNhbGxlZCB3aXRoIE5VTEwgZm9yCiAgIENBU0VfTE9XX1AgKGkuZS4gdGhl IGRlZmF1bHQgY2FzZSkuCiAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FzZSBs YWJlbCBpcyBpbiByYW5nZSBvZiBPUklHX1RZUEUgKHNhdHVyYXRlZCBvcgog ICB1bnRvdWNoZWQpIG9yIGZhbHNlIGlmIHRoZSBsYWJlbCBpcyBvdXQgb2Yg cmFuZ2UuICAqLwoKc3RhdGljIGJvb2wKY2hlY2tfY2FzZV9ib3VuZHMgKHRy ZWUgdHlwZSwgdHJlZSBvcmlnX3R5cGUsCgkJICAgdHJlZSAqY2FzZV9sb3df cCwgdHJlZSAqY2FzZV9oaWdoX3ApCnsKICB0cmVlIG1pbl92YWx1ZSwgbWF4 X3ZhbHVlOwogIHRyZWUgY2FzZV9sb3cgPSAqY2FzZV9sb3dfcDsKICB0cmVl IGNhc2VfaGlnaCA9IGNhc2VfaGlnaF9wID8gKmNhc2VfaGlnaF9wIDogY2Fz ZV9sb3c7CgogIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUg b3JpZ2luYWwgdHlwZSwgZG8gbm90aGluZy4gICovCiAgaWYgKG9yaWdfdHlw ZSA9PSBlcnJvcl9tYXJrX25vZGUpCiAgICByZXR1cm4gdHJ1ZTsKCiAgbWlu X3ZhbHVlID0gVFlQRV9NSU5fVkFMVUUgKG9yaWdfdHlwZSk7CiAgbWF4X3Zh bHVlID0gVFlQRV9NQVhfVkFMVUUgKG9yaWdfdHlwZSk7CgogIC8qIENhc2Ug bGFiZWwgaXMgbGVzcyB0aGFuIG1pbmltdW0gZm9yIHR5cGUuICAqLwogIGlm ICh0cmVlX2ludF9jc3RfY29tcGFyZSAoY2FzZV9sb3csIG1pbl92YWx1ZSkg PCAwCiAgICAgICYmIHRyZWVfaW50X2NzdF9jb21wYXJlIChjYXNlX2hpZ2gs IG1pbl92YWx1ZSkgPCAwKQogICAgewogICAgICB3YXJuaW5nICgwLCAiY2Fz ZSBsYWJlbCB2YWx1ZSBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBmb3Ig dHlwZSIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogIC8qIENhc2Ug dmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0gZm9yIHR5cGUuICAqLwog IGlmICh0cmVlX2ludF9jc3RfY29tcGFyZSAoY2FzZV9sb3csIG1heF92YWx1 ZSkgPiAwCiAgICAgICYmIHRyZWVfaW50X2NzdF9jb21wYXJlIChjYXNlX2hp Z2gsIG1heF92YWx1ZSkgPiAwKQogICAgewogICAgICB3YXJuaW5nICgwLCAi Y2FzZSBsYWJlbCB2YWx1ZSBleGNlZWRzIG1heGltdW0gdmFsdWUgZm9yIHR5 cGUiKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAvKiBTYXR1cmF0 ZSBsb3dlciBjYXNlIGxhYmVsIHZhbHVlIHRvIG1pbmltdW0uICAqLwogIGlm ICh0cmVlX2ludF9jc3RfY29tcGFyZSAoY2FzZV9oaWdoLCBtaW5fdmFsdWUp ID49IDAKICAgICAgJiYgdHJlZV9pbnRfY3N0X2NvbXBhcmUgKGNhc2VfbG93 LCBtaW5fdmFsdWUpIDwgMCkKICAgIHsKICAgICAgd2FybmluZyAoMCwgImxv d2VyIHZhbHVlIGluIGNhc2UgbGFiZWwgcmFuZ2UiCgkgICAgICAgIiBsZXNz IHRoYW4gbWluaW11bSB2YWx1ZSBmb3IgdHlwZSIpOwogICAgICBjYXNlX2xv dyA9IG1pbl92YWx1ZTsKICAgIH0KCiAgLyogU2F0dXJhdGUgdXBwZXIgY2Fz ZSBsYWJlbCB2YWx1ZSB0byBtYXhpbXVtLiAgKi8KICBpZiAodHJlZV9pbnRf Y3N0X2NvbXBhcmUgKGNhc2VfbG93LCBtYXhfdmFsdWUpIDw9IDAKICAgICAg JiYgdHJlZV9pbnRfY3N0X2NvbXBhcmUgKGNhc2VfaGlnaCwgbWF4X3ZhbHVl KSA+IDApCiAgICB7CiAgICAgIHdhcm5pbmcgKDAsICJ1cHBlciB2YWx1ZSBp biBjYXNlIGxhYmVsIHJhbmdlIgoJICAgICAgICIgZXhjZWVkcyBtYXhpbXVt IHZhbHVlIGZvciB0eXBlIik7CiAgICAgIGNhc2VfaGlnaCA9IG1heF92YWx1 ZTsKICAgIH0KCiAgaWYgKCpjYXNlX2xvd19wICE9IGNhc2VfbG93KQogICAg KmNhc2VfbG93X3AgPSBjb252ZXJ0ICh0eXBlLCBjYXNlX2xvdyk7CiAgaWYg KGNhc2VfaGlnaF9wICYmICpjYXNlX2hpZ2hfcCAhPSBjYXNlX2hpZ2gpCiAg ICAqY2FzZV9oaWdoX3AgPSBjb252ZXJ0ICh0eXBlLCBjYXNlX2hpZ2gpOwoK ICByZXR1cm4gdHJ1ZTsKfQoMCi8qIFJldHVybiBhbiBpbnRlZ2VyIHR5cGUg d2l0aCBCSVRTIGJpdHMgb2YgcHJlY2lzaW9uLAogICB0aGF0IGlzIHVuc2ln bmVkIGlmIFVOU0lHTkVEUCBpcyBub256ZXJvLCBvdGhlcndpc2Ugc2lnbmVk LiAgKi8KCnRyZWUKY19jb21tb25fdHlwZV9mb3Jfc2l6ZSAodW5zaWduZWQg aW50IGJpdHMsIGludCB1bnNpZ25lZHApCnsKICBpZiAoYml0cyA9PSBUWVBF X1BSRUNJU0lPTiAoaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVu c2lnbmVkcCA/IHVuc2lnbmVkX3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9u b2RlOwoKICBpZiAoYml0cyA9PSBUWVBFX1BSRUNJU0lPTiAoc2lnbmVkX2No YXJfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25l ZF9jaGFyX3R5cGVfbm9kZSA6IHNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKCiAg aWYgKGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKHNob3J0X2ludGVnZXJfdHlw ZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyBzaG9ydF91bnNpZ25l ZF90eXBlX25vZGUgOiBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYg KGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKGxvbmdfaW50ZWdlcl90eXBlX25v ZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfdW5zaWduZWRfdHlw ZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYgKGJpdHMg PT0gVFlQRV9QUkVDSVNJT04gKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9k ZSkpCiAgICByZXR1cm4gKHVuc2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25l ZF90eXBlX25vZGUKCSAgICA6IGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9k ZSk7CgogIGlmIChiaXRzID09IFRZUEVfUFJFQ0lTSU9OICh3aWRlc3RfaW50 ZWdlcl9saXRlcmFsX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gKHVuc2lnbmVk cCA/IHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVfbm9kZQoJICAgIDog d2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlX25vZGUpOwoKICBpZiAoYml0 cyA8PSBUWVBFX1BSRUNJU0lPTiAoaW50UUlfdHlwZV9ub2RlKSkKICAgIHJl dHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRRSV90eXBlX25vZGUgOiBp bnRRSV90eXBlX25vZGU7CgogIGlmIChiaXRzIDw9IFRZUEVfUFJFQ0lTSU9O IChpbnRISV90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVu c2lnbmVkX2ludEhJX3R5cGVfbm9kZSA6IGludEhJX3R5cGVfbm9kZTsKCiAg aWYgKGJpdHMgPD0gVFlQRV9QUkVDSVNJT04gKGludFNJX3R5cGVfbm9kZSkp CiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50U0lfdHlwZV9u b2RlIDogaW50U0lfdHlwZV9ub2RlOwoKICBpZiAoYml0cyA8PSBUWVBFX1BS RUNJU0lPTiAoaW50RElfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25l ZHAgPyB1bnNpZ25lZF9pbnRESV90eXBlX25vZGUgOiBpbnRESV90eXBlX25v ZGU7CgogIHJldHVybiAwOwp9CgovKiBSZXR1cm4gYSBmaXhlZC1wb2ludCB0 eXBlIHRoYXQgaGFzIGF0IGxlYXN0IElCSVQgaWJpdHMgYW5kIEZCSVQgZmJp dHMKICAgdGhhdCBpcyB1bnNpZ25lZCBpZiBVTlNJR05FRFAgaXMgbm9uemVy bywgb3RoZXJ3aXNlIHNpZ25lZDsKICAgYW5kIHNhdHVyYXRpbmcgaWYgU0FU UCBpcyBub256ZXJvLCBvdGhlcndpc2Ugbm90IHNhdHVyYXRpbmcuICAqLwoK dHJlZQpjX2NvbW1vbl9maXhlZF9wb2ludF90eXBlX2Zvcl9zaXplICh1bnNp Z25lZCBpbnQgaWJpdCwgdW5zaWduZWQgaW50IGZiaXQsCgkJCQkgICAgaW50 IHVuc2lnbmVkcCwgaW50IHNhdHApCnsKICBlbnVtIG1hY2hpbmVfbW9kZSBt b2RlOwogIGlmIChpYml0ID09IDApCiAgICBtb2RlID0gdW5zaWduZWRwID8g VVFRbW9kZSA6IFFRbW9kZTsKICBlbHNlCiAgICBtb2RlID0gdW5zaWduZWRw ID8gVUhBbW9kZSA6IEhBbW9kZTsKCiAgZm9yICg7IG1vZGUgIT0gVk9JRG1v ZGU7IG1vZGUgPSBHRVRfTU9ERV9XSURFUl9NT0RFIChtb2RlKSkKICAgIGlm IChHRVRfTU9ERV9JQklUIChtb2RlKSA+PSBpYml0ICYmIEdFVF9NT0RFX0ZC SVQgKG1vZGUpID49IGZiaXQpCiAgICAgIGJyZWFrOwoKICBpZiAobW9kZSA9 PSBWT0lEbW9kZSB8fCAhdGFyZ2V0bS5zY2FsYXJfbW9kZV9zdXBwb3J0ZWRf cCAobW9kZSkpCiAgICB7CiAgICAgIHNvcnJ5ICgiR0NDIGNhbm5vdCBzdXBw b3J0IG9wZXJhdG9ycyB3aXRoIGludGVnZXIgdHlwZXMgYW5kICIKCSAgICAg ImZpeGVkLXBvaW50IHR5cGVzIHRoYXQgaGF2ZSB0b28gbWFueSBpbnRlZ3Jh bCBhbmQgIgoJICAgICAiZnJhY3Rpb25hbCBiaXRzIHRvZ2V0aGVyIik7CiAg ICAgIHJldHVybiAwOwogICAgfQoKICByZXR1cm4gY19jb21tb25fdHlwZV9m b3JfbW9kZSAobW9kZSwgc2F0cCk7Cn0KCi8qIFVzZWQgZm9yIGNvbW11bmlj YXRpb24gYmV0d2VlbiBjX2NvbW1vbl90eXBlX2Zvcl9tb2RlIGFuZAogICBj X3JlZ2lzdGVyX2J1aWx0aW5fdHlwZS4gICovCnN0YXRpYyBHVFkoKCkpIHRy ZWUgcmVnaXN0ZXJlZF9idWlsdGluX3R5cGVzOwoKLyogUmV0dXJuIGEgZGF0 YSB0eXBlIHRoYXQgaGFzIG1hY2hpbmUgbW9kZSBNT0RFLgogICBJZiB0aGUg bW9kZSBpcyBhbiBpbnRlZ2VyLAogICB0aGVuIFVOU0lHTkVEUCBzZWxlY3Rz IGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCB0eXBlcy4KICAgSWYgdGhl IG1vZGUgaXMgYSBmaXhlZC1wb2ludCBtb2RlLAogICB0aGVuIFVOU0lHTkVE UCBzZWxlY3RzIGJldHdlZW4gc2F0dXJhdGluZyBhbmQgbm9uc2F0dXJhdGlu ZyB0eXBlcy4gICovCgp0cmVlCmNfY29tbW9uX3R5cGVfZm9yX21vZGUgKGVu dW0gbWFjaGluZV9tb2RlIG1vZGUsIGludCB1bnNpZ25lZHApCnsKICB0cmVl IHQ7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoaW50ZWdlcl90eXBlX25v ZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX3R5cGVfbm9k ZSA6IGludGVnZXJfdHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBUWVBFX01P REUgKHNpZ25lZF9jaGFyX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWdu ZWRwID8gdW5zaWduZWRfY2hhcl90eXBlX25vZGUgOiBzaWduZWRfY2hhcl90 eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoc2hvcnRfaW50 ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHNob3J0 X3Vuc2lnbmVkX3R5cGVfbm9kZSA6IHNob3J0X2ludGVnZXJfdHlwZV9ub2Rl OwoKICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGxvbmdfaW50ZWdlcl90eXBl X25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfdW5zaWduZWRf dHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFIChsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGUp KQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25lZF90 eXBlX25vZGUgOiBsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGU7CgogIGlm IChtb2RlID09IFRZUEVfTU9ERSAod2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90 eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHdpZGVzdF91bnNp Z25lZF9saXRlcmFsX3R5cGVfbm9kZQoJCSAgICAgOiB3aWRlc3RfaW50ZWdl cl9saXRlcmFsX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gUUltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFFJX3R5cGVfbm9k ZSA6IGludFFJX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gSEltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludEhJX3R5cGVfbm9k ZSA6IGludEhJX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gU0ltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFNJX3R5cGVfbm9k ZSA6IGludFNJX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gREltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludERJX3R5cGVfbm9k ZSA6IGludERJX3R5cGVfbm9kZTsKCiNpZiBIT1NUX0JJVFNfUEVSX1dJREVf SU5UID49IDY0CiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChpbnRUSV90eXBl X25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFRJ X3R5cGVfbm9kZSA6IGludFRJX3R5cGVfbm9kZTsKI2VuZGlmCgogIGlmICht b2RlID09IFRZUEVfTU9ERSAoZmxvYXRfdHlwZV9ub2RlKSkKICAgIHJldHVy biBmbG9hdF90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAo ZG91YmxlX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gZG91YmxlX3R5cGVfbm9k ZTsKCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChsb25nX2RvdWJsZV90eXBl X25vZGUpKQogICAgcmV0dXJuIGxvbmdfZG91YmxlX3R5cGVfbm9kZTsKCiAg aWYgKG1vZGUgPT0gVFlQRV9NT0RFICh2b2lkX3R5cGVfbm9kZSkpCiAgICBy ZXR1cm4gdm9pZF90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9E RSAoYnVpbGRfcG9pbnRlcl90eXBlIChjaGFyX3R5cGVfbm9kZSkpKQogICAg cmV0dXJuICh1bnNpZ25lZHAKCSAgICA/IG1ha2VfdW5zaWduZWRfdHlwZSAo R0VUX01PREVfUFJFQ0lTSU9OIChtb2RlKSkKCSAgICA6IG1ha2Vfc2lnbmVk X3R5cGUgKEdFVF9NT0RFX1BSRUNJU0lPTiAobW9kZSkpKTsKCiAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFIChidWlsZF9wb2ludGVyX3R5cGUgKGludGVnZXJf dHlwZV9ub2RlKSkpCiAgICByZXR1cm4gKHVuc2lnbmVkcAoJICAgID8gbWFr ZV91bnNpZ25lZF90eXBlIChHRVRfTU9ERV9QUkVDSVNJT04gKG1vZGUpKQoJ ICAgIDogbWFrZV9zaWduZWRfdHlwZSAoR0VUX01PREVfUFJFQ0lTSU9OICht b2RlKSkpOwoKICBpZiAoQ09NUExFWF9NT0RFX1AgKG1vZGUpKQogICAgewog ICAgICBlbnVtIG1hY2hpbmVfbW9kZSBpbm5lcl9tb2RlOwogICAgICB0cmVl IGlubmVyX3R5cGU7CgogICAgICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGNv bXBsZXhfZmxvYXRfdHlwZV9ub2RlKSkKCXJldHVybiBjb21wbGV4X2Zsb2F0 X3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChjb21w bGV4X2RvdWJsZV90eXBlX25vZGUpKQoJcmV0dXJuIGNvbXBsZXhfZG91Ymxl X3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChjb21w bGV4X2xvbmdfZG91YmxlX3R5cGVfbm9kZSkpCglyZXR1cm4gY29tcGxleF9s b25nX2RvdWJsZV90eXBlX25vZGU7CgogICAgICBpZiAobW9kZSA9PSBUWVBF X01PREUgKGNvbXBsZXhfaW50ZWdlcl90eXBlX25vZGUpICYmICF1bnNpZ25l ZHApCglyZXR1cm4gY29tcGxleF9pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgICAg IGlubmVyX21vZGUgPSBHRVRfTU9ERV9JTk5FUiAobW9kZSk7CiAgICAgIGlu bmVyX3R5cGUgPSBjX2NvbW1vbl90eXBlX2Zvcl9tb2RlIChpbm5lcl9tb2Rl LCB1bnNpZ25lZHApOwogICAgICBpZiAoaW5uZXJfdHlwZSAhPSBOVUxMX1RS RUUpCglyZXR1cm4gYnVpbGRfY29tcGxleF90eXBlIChpbm5lcl90eXBlKTsK ICAgIH0KICBlbHNlIGlmIChWRUNUT1JfTU9ERV9QIChtb2RlKSkKICAgIHsK ICAgICAgZW51bSBtYWNoaW5lX21vZGUgaW5uZXJfbW9kZSA9IEdFVF9NT0RF X0lOTkVSIChtb2RlKTsKICAgICAgdHJlZSBpbm5lcl90eXBlID0gY19jb21t b25fdHlwZV9mb3JfbW9kZSAoaW5uZXJfbW9kZSwgdW5zaWduZWRwKTsKICAg ICAgaWYgKGlubmVyX3R5cGUgIT0gTlVMTF9UUkVFKQoJcmV0dXJuIGJ1aWxk X3ZlY3Rvcl90eXBlX2Zvcl9tb2RlIChpbm5lcl90eXBlLCBtb2RlKTsKICAg IH0KCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChkZmxvYXQzMl90eXBlX25v ZGUpKQogICAgcmV0dXJuIGRmbG9hdDMyX3R5cGVfbm9kZTsKICBpZiAobW9k ZSA9PSBUWVBFX01PREUgKGRmbG9hdDY0X3R5cGVfbm9kZSkpCiAgICByZXR1 cm4gZGZsb2F0NjRfdHlwZV9ub2RlOwogIGlmIChtb2RlID09IFRZUEVfTU9E RSAoZGZsb2F0MTI4X3R5cGVfbm9kZSkpCiAgICByZXR1cm4gZGZsb2F0MTI4 X3R5cGVfbm9kZTsKCiAgaWYgKEFMTF9TQ0FMQVJfRklYRURfUE9JTlRfTU9E RV9QIChtb2RlKSkKICAgIHsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RF IChzaG9ydF9mcmFjdF90eXBlX25vZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/ IHNhdF9zaG9ydF9mcmFjdF90eXBlX25vZGUgOiBzaG9ydF9mcmFjdF90eXBl X25vZGU7CiAgICAgIGlmIChtb2RlID09IFRZUEVfTU9ERSAoZnJhY3RfdHlw ZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfZnJhY3RfdHlwZV9u b2RlIDogZnJhY3RfdHlwZV9ub2RlOwogICAgICBpZiAobW9kZSA9PSBUWVBF X01PREUgKGxvbmdfZnJhY3RfdHlwZV9ub2RlKSkKCXJldHVybiB1bnNpZ25l ZHAgPyBzYXRfbG9uZ19mcmFjdF90eXBlX25vZGUgOiBsb25nX2ZyYWN0X3R5 cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChsb25nX2xv bmdfZnJhY3RfdHlwZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRf bG9uZ19sb25nX2ZyYWN0X3R5cGVfbm9kZQoJCQkgOiBsb25nX2xvbmdfZnJh Y3RfdHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFICh1 bnNpZ25lZF9zaG9ydF9mcmFjdF90eXBlX25vZGUpKQoJcmV0dXJuIHVuc2ln bmVkcCA/IHNhdF91bnNpZ25lZF9zaG9ydF9mcmFjdF90eXBlX25vZGUKCQkJ IDogdW5zaWduZWRfc2hvcnRfZnJhY3RfdHlwZV9ub2RlOwogICAgICBpZiAo bW9kZSA9PSBUWVBFX01PREUgKHVuc2lnbmVkX2ZyYWN0X3R5cGVfbm9kZSkp CglyZXR1cm4gdW5zaWduZWRwID8gc2F0X3Vuc2lnbmVkX2ZyYWN0X3R5cGVf bm9kZQoJCQkgOiB1bnNpZ25lZF9mcmFjdF90eXBlX25vZGU7CiAgICAgIGlm IChtb2RlID09IFRZUEVfTU9ERSAodW5zaWduZWRfbG9uZ19mcmFjdF90eXBl X25vZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF91bnNpZ25lZF9sb25n X2ZyYWN0X3R5cGVfbm9kZQoJCQkgOiB1bnNpZ25lZF9sb25nX2ZyYWN0X3R5 cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFICh1bnNpZ25l ZF9sb25nX2xvbmdfZnJhY3RfdHlwZV9ub2RlKSkKCXJldHVybiB1bnNpZ25l ZHAgPyBzYXRfdW5zaWduZWRfbG9uZ19sb25nX2ZyYWN0X3R5cGVfbm9kZQoJ CQkgOiB1bnNpZ25lZF9sb25nX2xvbmdfZnJhY3RfdHlwZV9ub2RlOwoKICAg ICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChzaG9ydF9hY2N1bV90eXBlX25v ZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9zaG9ydF9hY2N1bV90eXBl X25vZGUgOiBzaG9ydF9hY2N1bV90eXBlX25vZGU7CiAgICAgIGlmIChtb2Rl ID09IFRZUEVfTU9ERSAoYWNjdW1fdHlwZV9ub2RlKSkKCXJldHVybiB1bnNp Z25lZHAgPyBzYXRfYWNjdW1fdHlwZV9ub2RlIDogYWNjdW1fdHlwZV9ub2Rl OwogICAgICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGxvbmdfYWNjdW1fdHlw ZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfbG9uZ19hY2N1bV90 eXBlX25vZGUgOiBsb25nX2FjY3VtX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFIChsb25nX2xvbmdfYWNjdW1fdHlwZV9ub2RlKSkK CXJldHVybiB1bnNpZ25lZHAgPyBzYXRfbG9uZ19sb25nX2FjY3VtX3R5cGVf bm9kZQoJCQkgOiBsb25nX2xvbmdfYWNjdW1fdHlwZV9ub2RlOwoKICAgICAg aWYgKG1vZGUgPT0gVFlQRV9NT0RFICh1bnNpZ25lZF9zaG9ydF9hY2N1bV90 eXBlX25vZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF91bnNpZ25lZF9z aG9ydF9hY2N1bV90eXBlX25vZGUKCQkJIDogdW5zaWduZWRfc2hvcnRfYWNj dW1fdHlwZV9ub2RlOwogICAgICBpZiAobW9kZSA9PSBUWVBFX01PREUgKHVu c2lnbmVkX2FjY3VtX3R5cGVfbm9kZSkpCglyZXR1cm4gdW5zaWduZWRwID8g c2F0X3Vuc2lnbmVkX2FjY3VtX3R5cGVfbm9kZQoJCQkgOiB1bnNpZ25lZF9h Y2N1bV90eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IFRZUEVfTU9ERSAo dW5zaWduZWRfbG9uZ19hY2N1bV90eXBlX25vZGUpKQoJcmV0dXJuIHVuc2ln bmVkcCA/IHNhdF91bnNpZ25lZF9sb25nX2FjY3VtX3R5cGVfbm9kZQoJCQkg OiB1bnNpZ25lZF9sb25nX2FjY3VtX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFICh1bnNpZ25lZF9sb25nX2xvbmdfYWNjdW1fdHlw ZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfdW5zaWduZWRfbG9u Z19sb25nX2FjY3VtX3R5cGVfbm9kZQoJCQkgOiB1bnNpZ25lZF9sb25nX2xv bmdfYWNjdW1fdHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gUVFtb2Rl KQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9xcV90eXBlX25vZGUgOiBxcV90 eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IEhRbW9kZSkKCXJldHVybiB1 bnNpZ25lZHAgPyBzYXRfaHFfdHlwZV9ub2RlIDogaHFfdHlwZV9ub2RlOwog ICAgICBpZiAobW9kZSA9PSBTUW1vZGUpCglyZXR1cm4gdW5zaWduZWRwID8g c2F0X3NxX3R5cGVfbm9kZSA6IHNxX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gRFFtb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9kcV90eXBl X25vZGUgOiBkcV90eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IFRRbW9k ZSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfdHFfdHlwZV9ub2RlIDogdHFf dHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gVVFRbW9kZSkKCXJldHVy biB1bnNpZ25lZHAgPyBzYXRfdXFxX3R5cGVfbm9kZSA6IHVxcV90eXBlX25v ZGU7CiAgICAgIGlmIChtb2RlID09IFVIUW1vZGUpCglyZXR1cm4gdW5zaWdu ZWRwID8gc2F0X3VocV90eXBlX25vZGUgOiB1aHFfdHlwZV9ub2RlOwogICAg ICBpZiAobW9kZSA9PSBVU1Ftb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNh dF91c3FfdHlwZV9ub2RlIDogdXNxX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gVURRbW9kZSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfdWRxX3R5 cGVfbm9kZSA6IHVkcV90eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IFVU UW1vZGUpCglyZXR1cm4gdW5zaWduZWRwID8gc2F0X3V0cV90eXBlX25vZGUg OiB1dHFfdHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gSEFtb2RlKQoJ cmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9oYV90eXBlX25vZGUgOiBoYV90eXBl X25vZGU7CiAgICAgIGlmIChtb2RlID09IFNBbW9kZSkKCXJldHVybiB1bnNp Z25lZHAgPyBzYXRfc2FfdHlwZV9ub2RlIDogc2FfdHlwZV9ub2RlOwogICAg ICBpZiAobW9kZSA9PSBEQW1vZGUpCglyZXR1cm4gdW5zaWduZWRwID8gc2F0 X2RhX3R5cGVfbm9kZSA6IGRhX3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUg PT0gVEFtb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF90YV90eXBlX25v ZGUgOiB0YV90eXBlX25vZGU7CgogICAgICBpZiAobW9kZSA9PSBVSEFtb2Rl KQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF91aGFfdHlwZV9ub2RlIDogdWhh X3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVVNBbW9kZSkKCXJldHVy biB1bnNpZ25lZHAgPyBzYXRfdXNhX3R5cGVfbm9kZSA6IHVzYV90eXBlX25v ZGU7CiAgICAgIGlmIChtb2RlID09IFVEQW1vZGUpCglyZXR1cm4gdW5zaWdu ZWRwID8gc2F0X3VkYV90eXBlX25vZGUgOiB1ZGFfdHlwZV9ub2RlOwogICAg ICBpZiAobW9kZSA9PSBVVEFtb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNh dF91dGFfdHlwZV9ub2RlIDogdXRhX3R5cGVfbm9kZTsKICAgIH0KCiAgZm9y ICh0ID0gcmVnaXN0ZXJlZF9idWlsdGluX3R5cGVzOyB0OyB0ID0gVFJFRV9D SEFJTiAodCkpCiAgICBpZiAoVFlQRV9NT0RFIChUUkVFX1ZBTFVFICh0KSkg PT0gbW9kZSkKICAgICAgcmV0dXJuIFRSRUVfVkFMVUUgKHQpOwoKICByZXR1 cm4gMDsKfQoKdHJlZQpjX2NvbW1vbl91bnNpZ25lZF90eXBlICh0cmVlIHR5 cGUpCnsKICByZXR1cm4gY19jb21tb25fc2lnbmVkX29yX3Vuc2lnbmVkX3R5 cGUgKDEsIHR5cGUpOwp9CgovKiBSZXR1cm4gYSBzaWduZWQgdHlwZSB0aGUg c2FtZSBhcyBUWVBFIGluIG90aGVyIHJlc3BlY3RzLiAgKi8KCnRyZWUKY19j b21tb25fc2lnbmVkX3R5cGUgKHRyZWUgdHlwZSkKewogIHJldHVybiBjX2Nv bW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAoMCwgdHlwZSk7Cn0KCi8q IFJldHVybiBhIHR5cGUgdGhlIHNhbWUgYXMgVFlQRSBleGNlcHQgdW5zaWdu ZWQgb3IKICAgc2lnbmVkIGFjY29yZGluZyB0byBVTlNJR05FRFAuICAqLwoK dHJlZQpjX2NvbW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAoaW50IHVu c2lnbmVkcCwgdHJlZSB0eXBlKQp7CiAgdHJlZSB0eXBlMTsKCiAgLyogVGhp cyBibG9jayBvZiBjb2RlIGVtdWxhdGVzIHRoZSBiZWhhdmlvciBvZiB0aGUg b2xkCiAgICAgY19jb21tb25fdW5zaWduZWRfdHlwZS4gSW4gcGFydGljdWxh ciwgaXQgcmV0dXJucwogICAgIGxvbmdfdW5zaWduZWRfdHlwZV9ub2RlIGlm IHBhc3NlZCBhIGxvbmcsIGV2ZW4gd2hlbiBhIGludCB3b3VsZAogICAgIGhh dmUgdGhlIHNhbWUgc2l6ZS4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHdhcm5p bmdzIHRvIHdvcmsKICAgICBjb3JyZWN0bHkgaW4gYXJjaHMgd2hlcmUgc2l6 ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpICovCgogIHR5cGUxID0gVFlQRV9N QUlOX1ZBUklBTlQgKHR5cGUpOwogIGlmICh0eXBlMSA9PSBzaWduZWRfY2hh cl90eXBlX25vZGUgfHwgdHlwZTEgPT0gY2hhcl90eXBlX25vZGUgfHwgdHlw ZTEgPT0gdW5zaWduZWRfY2hhcl90eXBlX25vZGUpCiAgICByZXR1cm4gdW5z aWduZWRwID8gdW5zaWduZWRfY2hhcl90eXBlX25vZGUgOiBzaWduZWRfY2hh cl90eXBlX25vZGU7CiAgaWYgKHR5cGUxID09IGludGVnZXJfdHlwZV9ub2Rl IHx8IHR5cGUxID09IHVuc2lnbmVkX3R5cGVfbm9kZSkKICAgIHJldHVybiB1 bnNpZ25lZHAgPyB1bnNpZ25lZF90eXBlX25vZGUgOiBpbnRlZ2VyX3R5cGVf bm9kZTsKICBpZiAodHlwZTEgPT0gc2hvcnRfaW50ZWdlcl90eXBlX25vZGUg fHwgdHlwZTEgPT0gc2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlKQogICAgcmV0 dXJuIHVuc2lnbmVkcCA/IHNob3J0X3Vuc2lnbmVkX3R5cGVfbm9kZSA6IHNo b3J0X2ludGVnZXJfdHlwZV9ub2RlOwogIGlmICh0eXBlMSA9PSBsb25nX2lu dGVnZXJfdHlwZV9ub2RlIHx8IHR5cGUxID09IGxvbmdfdW5zaWduZWRfdHlw ZV9ub2RlKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfdW5zaWduZWRf dHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAodHlw ZTEgPT0gbG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlIHx8IHR5cGUxID09 IGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUpCiAgICByZXR1cm4gdW5z aWduZWRwID8gbG9uZ19sb25nX3Vuc2lnbmVkX3R5cGVfbm9kZSA6IGxvbmdf bG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0gd2lkZXN0 X2ludGVnZXJfbGl0ZXJhbF90eXBlX25vZGUgfHwgdHlwZTEgPT0gd2lkZXN0 X3Vuc2lnbmVkX2xpdGVyYWxfdHlwZV9ub2RlKQogICAgcmV0dXJuIHVuc2ln bmVkcCA/IHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVfbm9kZSA6IHdp ZGVzdF9pbnRlZ2VyX2xpdGVyYWxfdHlwZV9ub2RlOwojaWYgSE9TVF9CSVRT X1BFUl9XSURFX0lOVCA+PSA2NAogIGlmICh0eXBlMSA9PSBpbnRUSV90eXBl X25vZGUgfHwgdHlwZTEgPT0gdW5zaWduZWRfaW50VElfdHlwZV9ub2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFRJX3R5cGVfbm9k ZSA6IGludFRJX3R5cGVfbm9kZTsKI2VuZGlmCiAgaWYgKHR5cGUxID09IGlu dERJX3R5cGVfbm9kZSB8fCB0eXBlMSA9PSB1bnNpZ25lZF9pbnRESV90eXBl X25vZGUpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50RElf dHlwZV9ub2RlIDogaW50RElfdHlwZV9ub2RlOwogIGlmICh0eXBlMSA9PSBp bnRTSV90eXBlX25vZGUgfHwgdHlwZTEgPT0gdW5zaWduZWRfaW50U0lfdHlw ZV9ub2RlKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFNJ X3R5cGVfbm9kZSA6IGludFNJX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0g aW50SElfdHlwZV9ub2RlIHx8IHR5cGUxID09IHVuc2lnbmVkX2ludEhJX3R5 cGVfbm9kZSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRI SV90eXBlX25vZGUgOiBpbnRISV90eXBlX25vZGU7CiAgaWYgKHR5cGUxID09 IGludFFJX3R5cGVfbm9kZSB8fCB0eXBlMSA9PSB1bnNpZ25lZF9pbnRRSV90 eXBlX25vZGUpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50 UUlfdHlwZV9ub2RlIDogaW50UUlfdHlwZV9ub2RlOwoKI2RlZmluZSBDX0NP TU1PTl9GSVhFRF9UWVBFUyhTQVQsTkFNRSkgXAogIGlmICh0eXBlMSA9PSBT QVQgIyMgc2hvcnRfICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCiAgICAgIHx8 IHR5cGUxID09IFNBVCAjIyB1bnNpZ25lZF9zaG9ydF8gIyMgTkFNRSAjIyBf dHlwZV9ub2RlKSBcCiAgICByZXR1cm4gdW5zaWduZWRwID8gU0FUICMjIHVu c2lnbmVkX3Nob3J0XyAjIyBOQU1FICMjIF90eXBlX25vZGUgXAoJCSAgICAg OiBTQVQgIyMgc2hvcnRfICMjIE5BTUUgIyMgX3R5cGVfbm9kZTsgXAogIGlm ICh0eXBlMSA9PSBTQVQgIyMgTkFNRSAjIyBfdHlwZV9ub2RlIFwKICAgICAg fHwgdHlwZTEgPT0gU0FUICMjIHVuc2lnbmVkXyAjIyBOQU1FICMjIF90eXBl X25vZGUpIFwKICAgIHJldHVybiB1bnNpZ25lZHAgPyBTQVQgIyMgdW5zaWdu ZWRfICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCgkJICAgICA6IFNBVCAjIyBO QU1FICMjIF90eXBlX25vZGU7IFwKICBpZiAodHlwZTEgPT0gU0FUICMjIGxv bmdfICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCiAgICAgIHx8IHR5cGUxID09 IFNBVCAjIyB1bnNpZ25lZF9sb25nXyAjIyBOQU1FICMjIF90eXBlX25vZGUp IFwKICAgIHJldHVybiB1bnNpZ25lZHAgPyBTQVQgIyMgdW5zaWduZWRfbG9u Z18gIyMgTkFNRSAjIyBfdHlwZV9ub2RlIFwKCQkgICAgIDogU0FUICMjIGxv bmdfICMjIE5BTUUgIyMgX3R5cGVfbm9kZTsgXAogIGlmICh0eXBlMSA9PSBT QVQgIyMgbG9uZ19sb25nXyAjIyBOQU1FICMjIF90eXBlX25vZGUgXAogICAg ICB8fCB0eXBlMSA9PSBTQVQgIyMgdW5zaWduZWRfbG9uZ19sb25nXyAjIyBO QU1FICMjIF90eXBlX25vZGUpIFwKICAgIHJldHVybiB1bnNpZ25lZHAgPyBT QVQgIyMgdW5zaWduZWRfbG9uZ19sb25nXyAjIyBOQU1FICMjIF90eXBlX25v ZGUgXAoJCSAgICAgOiBTQVQgIyMgbG9uZ19sb25nXyAjIyBOQU1FICMjIF90 eXBlX25vZGU7CgojZGVmaW5lIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMo U0FULE5BTUUpIFwKICBpZiAodHlwZTEgPT0gU0FUICMjIE5BTUUgIyMgX3R5 cGVfbm9kZSBcCiAgICAgIHx8IHR5cGUxID09IFNBVCAjIyB1ICMjIE5BTUUg IyMgX3R5cGVfbm9kZSkgXAogICAgcmV0dXJuIHVuc2lnbmVkcCA/IFNBVCAj IyB1ICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCgkJICAgICA6IFNBVCAjIyBO QU1FICMjIF90eXBlX25vZGU7CgogIENfQ09NTU9OX0ZJWEVEX1RZUEVTICgs IGZyYWN0KTsKICBDX0NPTU1PTl9GSVhFRF9UWVBFUyAoc2F0XywgZnJhY3Qp OwogIENfQ09NTU9OX0ZJWEVEX1RZUEVTICgsIGFjY3VtKTsKICBDX0NPTU1P Tl9GSVhFRF9UWVBFUyAoc2F0XywgYWNjdW0pOwoKICBDX0NPTU1PTl9GSVhF RF9NT0RFX1RZUEVTICgsIHFxKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZ UEVTICgsIGhxKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTICgsIHNx KTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTICgsIGRxKTsKICBDX0NP TU1PTl9GSVhFRF9NT0RFX1RZUEVTICgsIHRxKTsKICBDX0NPTU1PTl9GSVhF RF9NT0RFX1RZUEVTIChzYXRfLCBxcSk7CiAgQ19DT01NT05fRklYRURfTU9E RV9UWVBFUyAoc2F0XywgaHEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQ RVMgKHNhdF8sIHNxKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTIChz YXRfLCBkcSk7CiAgQ19DT01NT05fRklYRURfTU9ERV9UWVBFUyAoc2F0Xywg dHEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKCwgaGEpOwogIENf Q09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKCwgc2EpOwogIENfQ09NTU9OX0ZJ WEVEX01PREVfVFlQRVMgKCwgZGEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVf VFlQRVMgKCwgdGEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKHNh dF8sIGhhKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTIChzYXRfLCBz YSk7CiAgQ19DT01NT05fRklYRURfTU9ERV9UWVBFUyAoc2F0XywgZGEpOwog IENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKHNhdF8sIHRhKTsKCiAgLyog Rm9yIEVOVU1FUkFMX1RZUEVzIGluIEMrKywgbXVzdCBjaGVjayB0aGUgbW9k ZSBvZiB0aGUgdHlwZXMsIG5vdAogICAgIHRoZSBwcmVjaXNpb247IHRoZXkg aGF2ZSBwcmVjaXNpb24gc2V0IHRvIG1hdGNoIHRoZWlyIHJhbmdlLCBidXQK ICAgICBtYXkgdXNlIGEgd2lkZXIgbW9kZSB0byBtYXRjaCBhbiBBQkkuICBJ ZiB3ZSBjaGFuZ2UgbW9kZXMsIHdlIG1heQogICAgIHdpbmQgdXAgd2l0aCBi YWQgY29udmVyc2lvbnMuICBGb3IgSU5URUdFUl9UWVBFcyBpbiBDLCBtdXN0 IGNoZWNrCiAgICAgdGhlIHByZWNpc2lvbiBhcyB3ZWxsLCBzbyBhcyB0byB5 aWVsZCBjb3JyZWN0IHJlc3VsdHMgZm9yCiAgICAgYml0LWZpZWxkIHR5cGVz LiAgQysrIGRvZXMgbm90IGhhdmUgdGhlc2Ugc2VwYXJhdGUgYml0LWZpZWxk CiAgICAgdHlwZXMsIGFuZCBwcm9kdWNpbmcgYSBzaWduZWQgb3IgdW5zaWdu ZWQgdmFyaWFudCBvZiBhbgogICAgIEVOVU1FUkFMX1RZUEUgbWF5IGNhdXNl IG90aGVyIHByb2JsZW1zIGFzIHdlbGwuICAqLwoKICBpZiAoIUlOVEVHUkFM X1RZUEVfUCAodHlwZSkKICAgICAgfHwgVFlQRV9VTlNJR05FRCAodHlwZSkg PT0gdW5zaWduZWRwKQogICAgcmV0dXJuIHR5cGU7CgojZGVmaW5lIFRZUEVf T0sobm9kZSkJCQkJCQkJICAgIFwKICAoVFlQRV9NT0RFICh0eXBlKSA9PSBU WVBFX01PREUgKG5vZGUpCQkJCQkgICAgXAogICAmJiAoY19kaWFsZWN0X2N4 eCAoKSB8fCBUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQRV9QUkVDSVNJ T04gKG5vZGUpKSkKICBpZiAoVFlQRV9PSyAoc2lnbmVkX2NoYXJfdHlwZV9u b2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9jaGFyX3R5 cGVfbm9kZSA6IHNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKICBpZiAoVFlQRV9P SyAoaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/ IHVuc2lnbmVkX3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9ub2RlOwogIGlm IChUWVBFX09LIChzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZSkpCiAgICByZXR1 cm4gdW5zaWduZWRwID8gc2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlIDogc2hv cnRfaW50ZWdlcl90eXBlX25vZGU7CiAgaWYgKFRZUEVfT0sgKGxvbmdfaW50 ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdf dW5zaWduZWRfdHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsK ICBpZiAoVFlQRV9PSyAobG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlKSkK ICAgIHJldHVybiAodW5zaWduZWRwID8gbG9uZ19sb25nX3Vuc2lnbmVkX3R5 cGVfbm9kZQoJICAgIDogbG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlKTsK ICBpZiAoVFlQRV9PSyAod2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlX25v ZGUpKQogICAgcmV0dXJuICh1bnNpZ25lZHAgPyB3aWRlc3RfdW5zaWduZWRf bGl0ZXJhbF90eXBlX25vZGUKCSAgICA6IHdpZGVzdF9pbnRlZ2VyX2xpdGVy YWxfdHlwZV9ub2RlKTsKCiNpZiBIT1NUX0JJVFNfUEVSX1dJREVfSU5UID49 IDY0CiAgaWYgKFRZUEVfT0sgKGludFRJX3R5cGVfbm9kZSkpCiAgICByZXR1 cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50VElfdHlwZV9ub2RlIDogaW50 VElfdHlwZV9ub2RlOwojZW5kaWYKICBpZiAoVFlQRV9PSyAoaW50RElfdHlw ZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRE SV90eXBlX25vZGUgOiBpbnRESV90eXBlX25vZGU7CiAgaWYgKFRZUEVfT0sg KGludFNJX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5z aWduZWRfaW50U0lfdHlwZV9ub2RlIDogaW50U0lfdHlwZV9ub2RlOwogIGlm IChUWVBFX09LIChpbnRISV90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2ln bmVkcCA/IHVuc2lnbmVkX2ludEhJX3R5cGVfbm9kZSA6IGludEhJX3R5cGVf bm9kZTsKICBpZiAoVFlQRV9PSyAoaW50UUlfdHlwZV9ub2RlKSkKICAgIHJl dHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRRSV90eXBlX25vZGUgOiBp bnRRSV90eXBlX25vZGU7CiN1bmRlZiBUWVBFX09LCgogIGlmIChjX2RpYWxl Y3RfY3h4ICgpKQogICAgcmV0dXJuIHR5cGU7CiAgZWxzZQogICAgcmV0dXJu IGJ1aWxkX25vbnN0YW5kYXJkX2ludGVnZXJfdHlwZSAoVFlQRV9QUkVDSVNJ T04gKHR5cGUpLCB1bnNpZ25lZHApOwp9CgovKiBCdWlsZCBhIGJpdC1maWVs ZCBpbnRlZ2VyIHR5cGUgZm9yIHRoZSBnaXZlbiBXSURUSCBhbmQgVU5TSUdO RURQLiAgKi8KCnRyZWUKY19idWlsZF9iaXRmaWVsZF9pbnRlZ2VyX3R5cGUg KHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgd2lkdGgsIGludCB1bnNpZ25lZHAp CnsKICAvKiBFeHRlbmRlZCBpbnRlZ2VyIHR5cGVzIG9mIHRoZSBzYW1lIHdp ZHRoIGFzIGEgc3RhbmRhcmQgdHlwZSBoYXZlCiAgICAgbGVzc2VyIHJhbmss IHNvIHRob3NlIG9mIHRoZSBzYW1lIHdpZHRoIGFzIGludCBwcm9tb3RlIHRv IGludCBvcgogICAgIHVuc2lnbmVkIGludCBhbmQgYXJlIHZhbGlkIGZvciBw cmludGYgZm9ybWF0cyBleHBlY3RpbmcgaW50IG9yCiAgICAgdW5zaWduZWQg aW50LiAgVG8gYXZvaWQgc3VjaCBzcGVjaWFsIGNhc2VzLCBhdm9pZCBjcmVh dGluZwogICAgIGV4dGVuZGVkIGludGVnZXIgdHlwZXMgZm9yIGJpdC1maWVs ZHMgaWYgYSBzdGFuZGFyZCBpbnRlZ2VyIHR5cGUKICAgICBpcyBhdmFpbGFi bGUuICAqLwogIGlmICh3aWR0aCA9PSBUWVBFX1BSRUNJU0lPTiAoaW50ZWdl cl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVk X3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9ub2RlOwogIGlmICh3aWR0aCA9 PSBUWVBFX1BSRUNJU0lPTiAoc2lnbmVkX2NoYXJfdHlwZV9ub2RlKSkKICAg IHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9jaGFyX3R5cGVfbm9kZSA6 IHNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKICBpZiAod2lkdGggPT0gVFlQRV9Q UkVDSVNJT04gKHNob3J0X2ludGVnZXJfdHlwZV9ub2RlKSkKICAgIHJldHVy biB1bnNpZ25lZHAgPyBzaG9ydF91bnNpZ25lZF90eXBlX25vZGUgOiBzaG9y dF9pbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAod2lkdGggPT0gVFlQRV9QUkVD SVNJT04gKGxvbmdfaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVu c2lnbmVkcCA/IGxvbmdfdW5zaWduZWRfdHlwZV9ub2RlIDogbG9uZ19pbnRl Z2VyX3R5cGVfbm9kZTsKICBpZiAod2lkdGggPT0gVFlQRV9QUkVDSVNJT04g KGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gKHVu c2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUKCSAgICA6 IGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSk7CiAgcmV0dXJuIGJ1aWxk X25vbnN0YW5kYXJkX2ludGVnZXJfdHlwZSAod2lkdGgsIHVuc2lnbmVkcCk7 Cn0KCi8qIFRoZSBDIHZlcnNpb24gb2YgdGhlIHJlZ2lzdGVyX2J1aWx0aW5f dHlwZSBsYW5naG9vay4gICovCgp2b2lkCmNfcmVnaXN0ZXJfYnVpbHRpbl90 eXBlICh0cmVlIHR5cGUsIGNvbnN0IGNoYXIqIG5hbWUpCnsKICB0cmVlIGRl Y2w7CgogIGRlY2wgPSBidWlsZF9kZWNsIChUWVBFX0RFQ0wsIGdldF9pZGVu dGlmaWVyIChuYW1lKSwgdHlwZSk7CiAgREVDTF9BUlRJRklDSUFMIChkZWNs KSA9IDE7CiAgaWYgKCFUWVBFX05BTUUgKHR5cGUpKQogICAgVFlQRV9OQU1F ICh0eXBlKSA9IGRlY2w7CiAgcHVzaGRlY2wgKGRlY2wpOwoKICByZWdpc3Rl cmVkX2J1aWx0aW5fdHlwZXMgPSB0cmVlX2NvbnMgKDAsIHR5cGUsIHJlZ2lz dGVyZWRfYnVpbHRpbl90eXBlcyk7Cn0KCgwKLyogUmV0dXJuIHRoZSBtaW5p bXVtIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgVkFMVUUg aW4gYQogICBzaWduZWQgb3IgdW5zaWduZWQgdHlwZSwgVU5TSUdORURQIHNh eXMgd2hpY2guICAqLwoKdW5zaWduZWQgaW50Cm1pbl9wcmVjaXNpb24gKHRy ZWUgdmFsdWUsIGludCB1bnNpZ25lZHApCnsKICBpbnQgbG9nOwoKICAvKiBJ ZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUsIGNvbXB1dGUgaXRzIG5lZ2F0aXZl IG1pbnVzIDEuICBUaGUgbGF0dGVyCiAgICAgYWRqdXN0bWVudCBpcyBiZWNh dXNlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgbGFyZ2VzdCBuZWdhdGl2 ZSB2YWx1ZQogICAgIGlzIG9uZSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBw b3NpdGl2ZSB2YWx1ZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwogICAgIGEg Yml0LXdpc2UgbmVnYXRpb24sIHNvIHVzZSB0aGF0IG9wZXJhdGlvbiBpbnN0 ZWFkLiAgKi8KCiAgaWYgKHRyZWVfaW50X2NzdF9zZ24gKHZhbHVlKSA8IDAp CiAgICB2YWx1ZSA9IGZvbGRfYnVpbGQxIChCSVRfTk9UX0VYUFIsIFRSRUVf VFlQRSAodmFsdWUpLCB2YWx1ZSk7CgogIC8qIFJldHVybiB0aGUgbnVtYmVy IG9mIGJpdHMgbmVlZGVkLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBmYWN0 CiAgICAgdGhhdCB3ZSBuZWVkIG9uZSBtb3JlIGJpdCBmb3IgYSBzaWduZWQg dGhhbiB1bnNpZ25lZCB0eXBlLiAgKi8KCiAgaWYgKGludGVnZXJfemVyb3Ag KHZhbHVlKSkKICAgIGxvZyA9IDA7CiAgZWxzZQogICAgbG9nID0gdHJlZV9m bG9vcl9sb2cyICh2YWx1ZSk7CgogIHJldHVybiBsb2cgKyAxICsgIXVuc2ln bmVkcDsKfQoMCi8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgZm9yIGludmFs aWQgb3BlcmFuZHMgdG8gYXJpdGggb3BlcmF0aW9uCiAgIENPREUgd2l0aCBU WVBFMCBmb3Igb3BlcmFuZCAwLCBhbmQgVFlQRTEgZm9yIG9wZXJhbmQgMS4g ICovCgp2b2lkCmJpbmFyeV9vcF9lcnJvciAoZW51bSB0cmVlX2NvZGUgY29k ZSwgdHJlZSB0eXBlMCwgdHJlZSB0eXBlMSkKewogIGNvbnN0IGNoYXIgKm9w bmFtZTsKCiAgc3dpdGNoIChjb2RlKQogICAgewogICAgY2FzZSBQTFVTX0VY UFI6CiAgICAgIG9wbmFtZSA9ICIrIjsgYnJlYWs7CiAgICBjYXNlIE1JTlVT X0VYUFI6CiAgICAgIG9wbmFtZSA9ICItIjsgYnJlYWs7CiAgICBjYXNlIE1V TFRfRVhQUjoKICAgICAgb3BuYW1lID0gIioiOyBicmVhazsKICAgIGNhc2Ug TUFYX0VYUFI6CiAgICAgIG9wbmFtZSA9ICJtYXgiOyBicmVhazsKICAgIGNh c2UgTUlOX0VYUFI6CiAgICAgIG9wbmFtZSA9ICJtaW4iOyBicmVhazsKICAg IGNhc2UgRVFfRVhQUjoKICAgICAgb3BuYW1lID0gIj09IjsgYnJlYWs7CiAg ICBjYXNlIE5FX0VYUFI6CiAgICAgIG9wbmFtZSA9ICIhPSI7IGJyZWFrOwog ICAgY2FzZSBMRV9FWFBSOgogICAgICBvcG5hbWUgPSAiPD0iOyBicmVhazsK ICAgIGNhc2UgR0VfRVhQUjoKICAgICAgb3BuYW1lID0gIj49IjsgYnJlYWs7 CiAgICBjYXNlIExUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI8IjsgYnJlYWs7 CiAgICBjYXNlIEdUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI+IjsgYnJlYWs7 CiAgICBjYXNlIExTSElGVF9FWFBSOgogICAgICBvcG5hbWUgPSAiPDwiOyBi cmVhazsKICAgIGNhc2UgUlNISUZUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI+ PiI7IGJyZWFrOwogICAgY2FzZSBUUlVOQ19NT0RfRVhQUjoKICAgIGNhc2Ug RkxPT1JfTU9EX0VYUFI6CiAgICAgIG9wbmFtZSA9ICIlIjsgYnJlYWs7CiAg ICBjYXNlIFRSVU5DX0RJVl9FWFBSOgogICAgY2FzZSBGTE9PUl9ESVZfRVhQ UjoKICAgICAgb3BuYW1lID0gIi8iOyBicmVhazsKICAgIGNhc2UgQklUX0FO RF9FWFBSOgogICAgICBvcG5hbWUgPSAiJiI7IGJyZWFrOwogICAgY2FzZSBC SVRfSU9SX0VYUFI6CiAgICAgIG9wbmFtZSA9ICJ8IjsgYnJlYWs7CiAgICBj YXNlIFRSVVRIX0FORElGX0VYUFI6CiAgICAgIG9wbmFtZSA9ICImJiI7IGJy ZWFrOwogICAgY2FzZSBUUlVUSF9PUklGX0VYUFI6CiAgICAgIG9wbmFtZSA9 ICJ8fCI7IGJyZWFrOwogICAgY2FzZSBCSVRfWE9SX0VYUFI6CiAgICAgIG9w bmFtZSA9ICJeIjsgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5y ZWFjaGFibGUgKCk7CiAgICB9CiAgZXJyb3IgKCJpbnZhbGlkIG9wZXJhbmRz IHRvIGJpbmFyeSAlcyAoaGF2ZSAlcVQgYW5kICVxVCkiLCBvcG5hbWUsCgkg dHlwZTAsIHR5cGUxKTsKfQoMCi8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfYmlu YXJ5X29wLCB1c2VkIGZvciBjb21wYXJpc29uIG9wZXJhdGlvbnMuCiAgIFNl ZSBpZiB0aGUgb3BlcmFuZHMgaGF2ZSBib3RoIGJlZW4gY29udmVydGVkIGZy b20gc3Vid29yZCBpbnRlZ2VyIHR5cGVzCiAgIGFuZCwgaWYgc28sIHBlcmhh cHMgY2hhbmdlIHRoZW0gYm90aCBiYWNrIHRvIHRoZWlyIG9yaWdpbmFsIHR5 cGUuCiAgIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyByZXNwb25zaWJsZSBmb3Ig Y29udmVydGluZyB0aGUgdHdvIG9wZXJhbmRzCiAgIHRvIHRoZSBwcm9wZXIg Y29tbW9uIHR5cGUgZm9yIGNvbXBhcmlzb24uCgogICBUaGUgYXJndW1lbnRz IG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFsbCBwb2ludGVycyB0byBsb2NhbCB2 YXJpYWJsZXMKICAgb2YgYnVpbGRfYmluYXJ5X29wOiBPUDBfUFRSIGlzICZP UDAsIE9QMV9QVFIgaXMgJk9QMSwKICAgUkVTVFlQRV9QVFIgaXMgJlJFU1VM VF9UWVBFIGFuZCBSRVNDT0RFX1BUUiBpcyAmUkVTVUxUQ09ERS4KCiAgIElm IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBub256ZXJvLCBpdCBtZWFucyB0aGF0 IHRoZSBjb21wYXJpc29uIGhhcwogICBhIGNvbnN0YW50IHZhbHVlLiAgV2hh dCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgaXMgYW4gZXhwcmVzc2lvbiBmb3IK ICAgdGhhdCB2YWx1ZS4gICovCgp0cmVlCnNob3J0ZW5fY29tcGFyZSAodHJl ZSAqb3AwX3B0ciwgdHJlZSAqb3AxX3B0ciwgdHJlZSAqcmVzdHlwZV9wdHIs CgkJIGVudW0gdHJlZV9jb2RlICpyZXNjb2RlX3B0cikKewogIHRyZWUgdHlw ZTsKICB0cmVlIG9wMCA9ICpvcDBfcHRyOwogIHRyZWUgb3AxID0gKm9wMV9w dHI7CiAgaW50IHVuc2lnbmVkcDAsIHVuc2lnbmVkcDE7CiAgaW50IHJlYWwx LCByZWFsMjsKICB0cmVlIHByaW1vcDAsIHByaW1vcDE7CiAgZW51bSB0cmVl X2NvZGUgY29kZSA9ICpyZXNjb2RlX3B0cjsKCiAgLyogVGhyb3cgYXdheSBh bnkgY29udmVyc2lvbnMgdG8gd2lkZXIgdHlwZXMKICAgICBhbHJlYWR5IHBy ZXNlbnQgaW4gdGhlIG9wZXJhbmRzLiAgKi8KCiAgcHJpbW9wMCA9IGdldF9u YXJyb3dlciAob3AwLCAmdW5zaWduZWRwMCk7CiAgcHJpbW9wMSA9IGdldF9u YXJyb3dlciAob3AxLCAmdW5zaWduZWRwMSk7CgogIC8qIEhhbmRsZSB0aGUg Y2FzZSB0aGF0IE9QMCBkb2VzIG5vdCAqY29udGFpbiogYSBjb252ZXJzaW9u CiAgICAgYnV0IGl0ICpyZXF1aXJlcyogY29udmVyc2lvbiB0byBGSU5BTF9U WVBFLiAgKi8KCiAgaWYgKG9wMCA9PSBwcmltb3AwICYmIFRSRUVfVFlQRSAo b3AwKSAhPSAqcmVzdHlwZV9wdHIpCiAgICB1bnNpZ25lZHAwID0gVFlQRV9V TlNJR05FRCAoVFJFRV9UWVBFIChvcDApKTsKICBpZiAob3AxID09IHByaW1v cDEgJiYgVFJFRV9UWVBFIChvcDEpICE9ICpyZXN0eXBlX3B0cikKICAgIHVu c2lnbmVkcDEgPSBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG9wMSkpOwoK ICAvKiBJZiBvbmUgb2YgdGhlIG9wZXJhbmRzIG11c3QgYmUgZmxvYXRlZCwg d2UgY2Fubm90IG9wdGltaXplLiAgKi8KICByZWFsMSA9IFRSRUVfQ09ERSAo VFJFRV9UWVBFIChwcmltb3AwKSkgPT0gUkVBTF9UWVBFOwogIHJlYWwyID0g VFJFRV9DT0RFIChUUkVFX1RZUEUgKHByaW1vcDEpKSA9PSBSRUFMX1RZUEU7 CgogIC8qIElmIGZpcnN0IGFyZyBpcyBjb25zdGFudCwgc3dhcCB0aGUgYXJn cyAoY2hhbmdpbmcgb3BlcmF0aW9uCiAgICAgc28gdmFsdWUgaXMgcHJlc2Vy dmVkKSwgZm9yIGNhbm9uaWNhbGl6YXRpb24uICBEb24ndCBkbyB0aGlzIGlm CiAgICAgdGhlIHNlY29uZCBhcmcgaXMgMC4gICovCgogIGlmIChUUkVFX0NP TlNUQU5UIChwcmltb3AwKQogICAgICAmJiAhaW50ZWdlcl96ZXJvcCAocHJp bW9wMSkgJiYgIXJlYWxfemVyb3AgKHByaW1vcDEpCiAgICAgICYmICFmaXhl ZF96ZXJvcCAocHJpbW9wMSkpCiAgICB7CiAgICAgIHRyZWUgdGVtID0gcHJp bW9wMDsKICAgICAgaW50IHRlbWkgPSB1bnNpZ25lZHAwOwogICAgICBwcmlt b3AwID0gcHJpbW9wMTsKICAgICAgcHJpbW9wMSA9IHRlbTsKICAgICAgdGVt ID0gb3AwOwogICAgICBvcDAgPSBvcDE7CiAgICAgIG9wMSA9IHRlbTsKICAg ICAgKm9wMF9wdHIgPSBvcDA7CiAgICAgICpvcDFfcHRyID0gb3AxOwogICAg ICB1bnNpZ25lZHAwID0gdW5zaWduZWRwMTsKICAgICAgdW5zaWduZWRwMSA9 IHRlbWk7CiAgICAgIHRlbWkgPSByZWFsMTsKICAgICAgcmVhbDEgPSByZWFs MjsKICAgICAgcmVhbDIgPSB0ZW1pOwoKICAgICAgc3dpdGNoIChjb2RlKQoJ ewoJY2FzZSBMVF9FWFBSOgoJICBjb2RlID0gR1RfRVhQUjsKCSAgYnJlYWs7 CgljYXNlIEdUX0VYUFI6CgkgIGNvZGUgPSBMVF9FWFBSOwoJICBicmVhazsK CWNhc2UgTEVfRVhQUjoKCSAgY29kZSA9IEdFX0VYUFI7CgkgIGJyZWFrOwoJ Y2FzZSBHRV9FWFBSOgoJICBjb2RlID0gTEVfRVhQUjsKCSAgYnJlYWs7Cglk ZWZhdWx0OgoJICBicmVhazsKCX0KICAgICAgKnJlc2NvZGVfcHRyID0gY29k ZTsKICAgIH0KCiAgLyogSWYgY29tcGFyaW5nIGFuIGludGVnZXIgYWdhaW5z dCBhIGNvbnN0YW50IG1vcmUgYml0cyB3aWRlLAogICAgIG1heWJlIHdlIGNh biBkZWR1Y2UgYSB2YWx1ZSBvZiAxIG9yIDAgaW5kZXBlbmRlbnQgb2YgdGhl IGRhdGEuCiAgICAgT3IgZWxzZSB0cnVuY2F0ZSB0aGUgY29uc3RhbnQgbm93 CiAgICAgcmF0aGVyIHRoYW4gZXh0ZW5kIHRoZSB2YXJpYWJsZSBhdCBydW4g dGltZS4KCiAgICAgVGhpcyBpcyBvbmx5IGludGVyZXN0aW5nIGlmIHRoZSBj b25zdGFudCBpcyB0aGUgd2lkZXIgYXJnLgogICAgIEFsc28sIGl0IGlzIG5v dCBzYWZlIGlmIHRoZSBjb25zdGFudCBpcyB1bnNpZ25lZCBhbmQgdGhlCiAg ICAgdmFyaWFibGUgYXJnIGlzIHNpZ25lZCwgc2luY2UgaW4gdGhpcyBjYXNl IHRoZSB2YXJpYWJsZQogICAgIHdvdWxkIGJlIHNpZ24tZXh0ZW5kZWQgYW5k IHRoZW4gcmVnYXJkZWQgYXMgdW5zaWduZWQuCiAgICAgT3VyIHRlY2huaXF1 ZSBmYWlscyBpbiB0aGlzIGNhc2UgYmVjYXVzZSB0aGUgbG93ZXN0L2hpZ2hl c3QKICAgICBwb3NzaWJsZSB1bnNpZ25lZCByZXN1bHRzIGRvbid0IGZvbGxv dyBuYXR1cmFsbHkgZnJvbSB0aGUKICAgICBsb3dlc3QvaGlnaGVzdCBwb3Nz aWJsZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlIG9wZXJhbmQuCiAgICAgRm9y IGp1c3QgRVFfRVhQUiBhbmQgTkVfRVhQUiB0aGVyZSBpcyBhbm90aGVyIHRl Y2huaXF1ZSB0aGF0CiAgICAgY291bGQgYmUgdXNlZDogc2VlIGlmIHRoZSBj b25zdGFudCBjYW4gYmUgZmFpdGhmdWxseSByZXByZXNlbnRlZAogICAgIGlu IHRoZSBvdGhlciBvcGVyYW5kJ3MgdHlwZSwgYnkgdHJ1bmNhdGluZyBpdCBh bmQgcmVleHRlbmRpbmcgaXQKICAgICBhbmQgc2VlIGlmIHRoYXQgcHJlc2Vy dmVzIHRoZSBjb25zdGFudCdzIHZhbHVlLiAgKi8KCiAgaWYgKCFyZWFsMSAm JiAhcmVhbDIKICAgICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKHByaW1v cDApKSAhPSBGSVhFRF9QT0lOVF9UWVBFCiAgICAgICYmIFRSRUVfQ09ERSAo cHJpbW9wMSkgPT0gSU5URUdFUl9DU1QKICAgICAgJiYgVFlQRV9QUkVDSVNJ T04gKFRSRUVfVFlQRSAocHJpbW9wMCkpIDwgVFlQRV9QUkVDSVNJT04gKCpy ZXN0eXBlX3B0cikpCiAgICB7CiAgICAgIGludCBtaW5fZ3QsIG1heF9ndCwg bWluX2x0LCBtYXhfbHQ7CiAgICAgIHRyZWUgbWF4dmFsLCBtaW52YWw7CiAg ICAgIC8qIDEgaWYgY29tcGFyaXNvbiBpcyBub21pbmFsbHkgdW5zaWduZWQu ICAqLwogICAgICBpbnQgdW5zaWduZWRwID0gVFlQRV9VTlNJR05FRCAoKnJl c3R5cGVfcHRyKTsKICAgICAgdHJlZSB2YWw7CgogICAgICB0eXBlID0gY19j b21tb25fc2lnbmVkX29yX3Vuc2lnbmVkX3R5cGUgKHVuc2lnbmVkcDAsCgkJ CQkJICAgICAgIFRSRUVfVFlQRSAocHJpbW9wMCkpOwoKICAgICAgbWF4dmFs ID0gVFlQRV9NQVhfVkFMVUUgKHR5cGUpOwogICAgICBtaW52YWwgPSBUWVBF X01JTl9WQUxVRSAodHlwZSk7CgogICAgICBpZiAodW5zaWduZWRwICYmICF1 bnNpZ25lZHAwKQoJKnJlc3R5cGVfcHRyID0gY19jb21tb25fc2lnbmVkX3R5 cGUgKCpyZXN0eXBlX3B0cik7CgogICAgICBpZiAoVFJFRV9UWVBFIChwcmlt b3AxKSAhPSAqcmVzdHlwZV9wdHIpCgl7CgkgIC8qIENvbnZlcnQgcHJpbW9w MSB0byB0YXJnZXQgdHlwZSwgYnV0IGRvIG5vdCBpbnRyb2R1Y2UKCSAgICAg YWRkaXRpb25hbCBvdmVyZmxvdy4gIFdlIGtub3cgcHJpbW9wMSBpcyBhbiBp bnRfY3N0LiAgKi8KCSAgcHJpbW9wMSA9IGZvcmNlX2ZpdF90eXBlX2RvdWJs ZSAoKnJlc3R5cGVfcHRyLAoJCQkJCSAgIFRSRUVfSU5UX0NTVF9MT1cgKHBy aW1vcDEpLAoJCQkJCSAgIFRSRUVfSU5UX0NTVF9ISUdIIChwcmltb3AxKSwg MCwKCQkJCQkgICBUUkVFX09WRVJGTE9XIChwcmltb3AxKSk7Cgl9CiAgICAg IGlmICh0eXBlICE9ICpyZXN0eXBlX3B0cikKCXsKCSAgbWludmFsID0gY29u dmVydCAoKnJlc3R5cGVfcHRyLCBtaW52YWwpOwoJICBtYXh2YWwgPSBjb252 ZXJ0ICgqcmVzdHlwZV9wdHIsIG1heHZhbCk7Cgl9CgogICAgICBpZiAodW5z aWduZWRwICYmIHVuc2lnbmVkcDApCgl7CgkgIG1pbl9ndCA9IElOVF9DU1Rf TFRfVU5TSUdORUQgKHByaW1vcDEsIG1pbnZhbCk7CgkgIG1heF9ndCA9IElO VF9DU1RfTFRfVU5TSUdORUQgKHByaW1vcDEsIG1heHZhbCk7CgkgIG1pbl9s dCA9IElOVF9DU1RfTFRfVU5TSUdORUQgKG1pbnZhbCwgcHJpbW9wMSk7Cgkg IG1heF9sdCA9IElOVF9DU1RfTFRfVU5TSUdORUQgKG1heHZhbCwgcHJpbW9w MSk7Cgl9CiAgICAgIGVsc2UKCXsKCSAgbWluX2d0ID0gSU5UX0NTVF9MVCAo cHJpbW9wMSwgbWludmFsKTsKCSAgbWF4X2d0ID0gSU5UX0NTVF9MVCAocHJp bW9wMSwgbWF4dmFsKTsKCSAgbWluX2x0ID0gSU5UX0NTVF9MVCAobWludmFs LCBwcmltb3AxKTsKCSAgbWF4X2x0ID0gSU5UX0NTVF9MVCAobWF4dmFsLCBw cmltb3AxKTsKCX0KCiAgICAgIHZhbCA9IDA7CiAgICAgIC8qIFRoaXMgdXNl ZCB0byBiZSBhIHN3aXRjaCwgYnV0IEdlbml4IGNvbXBpbGVyIGNhbid0IGhh bmRsZSB0aGF0LiAgKi8KICAgICAgaWYgKGNvZGUgPT0gTkVfRVhQUikKCXsK CSAgaWYgKG1heF9sdCB8fCBtaW5fZ3QpCgkgICAgdmFsID0gdHJ1dGh2YWx1 ZV90cnVlX25vZGU7Cgl9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gRVFfRVhQ UikKCXsKCSAgaWYgKG1heF9sdCB8fCBtaW5fZ3QpCgkgICAgdmFsID0gdHJ1 dGh2YWx1ZV9mYWxzZV9ub2RlOwoJfQogICAgICBlbHNlIGlmIChjb2RlID09 IExUX0VYUFIpCgl7CgkgIGlmIChtYXhfbHQpCgkgICAgdmFsID0gdHJ1dGh2 YWx1ZV90cnVlX25vZGU7CgkgIGlmICghbWluX2x0KQoJICAgIHZhbCA9IHRy dXRodmFsdWVfZmFsc2Vfbm9kZTsKCX0KICAgICAgZWxzZSBpZiAoY29kZSA9 PSBHVF9FWFBSKQoJewoJICBpZiAobWluX2d0KQoJICAgIHZhbCA9IHRydXRo dmFsdWVfdHJ1ZV9ub2RlOwoJICBpZiAoIW1heF9ndCkKCSAgICB2YWwgPSB0 cnV0aHZhbHVlX2ZhbHNlX25vZGU7Cgl9CiAgICAgIGVsc2UgaWYgKGNvZGUg PT0gTEVfRVhQUikKCXsKCSAgaWYgKCFtYXhfZ3QpCgkgICAgdmFsID0gdHJ1 dGh2YWx1ZV90cnVlX25vZGU7CgkgIGlmIChtaW5fZ3QpCgkgICAgdmFsID0g dHJ1dGh2YWx1ZV9mYWxzZV9ub2RlOwoJfQogICAgICBlbHNlIGlmIChjb2Rl ID09IEdFX0VYUFIpCgl7CgkgIGlmICghbWluX2x0KQoJICAgIHZhbCA9IHRy dXRodmFsdWVfdHJ1ZV9ub2RlOwoJICBpZiAobWF4X2x0KQoJICAgIHZhbCA9 IHRydXRodmFsdWVfZmFsc2Vfbm9kZTsKCX0KCiAgICAgIC8qIElmIHByaW1v cDAgd2FzIHNpZ24tZXh0ZW5kZWQgYW5kIHVuc2lnbmVkIGNvbXBhcmlzb24g c3BlY2QsCgkgd2UgZGlkIGEgc2lnbmVkIGNvbXBhcmlzb24gYWJvdmUgdXNp bmcgdGhlIHNpZ25lZCB0eXBlIGJvdW5kcy4KCSBCdXQgdGhlIGNvbXBhcmlz b24gd2Ugb3V0cHV0IG11c3QgYmUgdW5zaWduZWQuCgoJIEFsc28sIGZvciBp bmVxdWFsaXRpZXMsIFZBTCBpcyBubyBnb29kOyBidXQgaWYgdGhlIHNpZ25l ZAoJIGNvbXBhcmlzb24gaGFkICphbnkqIGZpeGVkIHJlc3VsdCwgaXQgZm9s bG93cyB0aGF0IHRoZQoJIHVuc2lnbmVkIGNvbXBhcmlzb24ganVzdCB0ZXN0 cyB0aGUgc2lnbiBpbiByZXZlcnNlCgkgKHBvc2l0aXZlIHZhbHVlcyBhcmUg TEUsIG5lZ2F0aXZlIG9uZXMgR0UpLgoJIFNvIHdlIGNhbiBnZW5lcmF0ZSBh biB1bnNpZ25lZCBjb21wYXJpc29uCgkgYWdhaW5zdCBhbiBleHRyZW1lIHZh bHVlIG9mIHRoZSBzaWduZWQgdHlwZS4gICovCgogICAgICBpZiAodW5zaWdu ZWRwICYmICF1bnNpZ25lZHAwKQoJewoJICBpZiAodmFsICE9IDApCgkgICAg c3dpdGNoIChjb2RlKQoJICAgICAgewoJICAgICAgY2FzZSBMVF9FWFBSOgoJ ICAgICAgY2FzZSBHRV9FWFBSOgoJCXByaW1vcDEgPSBUWVBFX01JTl9WQUxV RSAodHlwZSk7CgkJdmFsID0gMDsKCQlicmVhazsKCgkgICAgICBjYXNlIExF X0VYUFI6CgkgICAgICBjYXNlIEdUX0VYUFI6CgkJcHJpbW9wMSA9IFRZUEVf TUFYX1ZBTFVFICh0eXBlKTsKCQl2YWwgPSAwOwoJCWJyZWFrOwoKCSAgICAg IGRlZmF1bHQ6CgkJYnJlYWs7CgkgICAgICB9CgkgIHR5cGUgPSBjX2NvbW1v bl91bnNpZ25lZF90eXBlICh0eXBlKTsKCX0KCiAgICAgIGlmIChUUkVFX0NP REUgKHByaW1vcDApICE9IElOVEVHRVJfQ1NUKQoJewoJICBpZiAodmFsID09 IHRydXRodmFsdWVfZmFsc2Vfbm9kZSkKCSAgICB3YXJuaW5nIChPUFRfV3R5 cGVfbGltaXRzLCAiY29tcGFyaXNvbiBpcyBhbHdheXMgZmFsc2UgZHVlIHRv IGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIik7CgkgIGlmICh2YWwgPT0g dHJ1dGh2YWx1ZV90cnVlX25vZGUpCgkgICAgd2FybmluZyAoT1BUX1d0eXBl X2xpbWl0cywgImNvbXBhcmlzb24gaXMgYWx3YXlzIHRydWUgZHVlIHRvIGxp bWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIik7Cgl9CgogICAgICBpZiAodmFs ICE9IDApCgl7CgkgIC8qIERvbid0IGZvcmdldCB0byBldmFsdWF0ZSBQUklN T1AwIGlmIGl0IGhhcyBzaWRlIGVmZmVjdHMuICAqLwoJICBpZiAoVFJFRV9T SURFX0VGRkVDVFMgKHByaW1vcDApKQoJICAgIHJldHVybiBidWlsZDIgKENP TVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAodmFsKSwgcHJpbW9wMCwgdmFsKTsK CSAgcmV0dXJuIHZhbDsKCX0KCiAgICAgIC8qIFZhbHVlIGlzIG5vdCBwcmVk ZXRlcm1pbmVkLCBidXQgZG8gdGhlIGNvbXBhcmlzb24KCSBpbiB0aGUgdHlw ZSBvZiB0aGUgb3BlcmFuZCB0aGF0IGlzIG5vdCBjb25zdGFudC4KCSBUWVBF IGlzIGFscmVhZHkgcHJvcGVybHkgc2V0LiAgKi8KICAgIH0KCiAgLyogSWYg ZWl0aGVyIGFyZyBpcyBkZWNpbWFsIGZsb2F0IGFuZCB0aGUgb3RoZXIgaXMg ZmxvYXQsIGZpbmQgdGhlCiAgICAgcHJvcGVyIGNvbW1vbiB0eXBlIHRvIHVz ZSBmb3IgY29tcGFyaXNvbi4gICovCiAgZWxzZSBpZiAocmVhbDEgJiYgcmVh bDIKCSAgICYmIChERUNJTUFMX0ZMT0FUX01PREVfUCAoVFlQRV9NT0RFIChU UkVFX1RZUEUgKHByaW1vcDApKSkKCSAgICAgICB8fCBERUNJTUFMX0ZMT0FU X01PREVfUCAoVFlQRV9NT0RFIChUUkVFX1RZUEUgKHByaW1vcDEpKSkpKQog ICAgdHlwZSA9IGNvbW1vbl90eXBlIChUUkVFX1RZUEUgKHByaW1vcDApLCBU UkVFX1RZUEUgKHByaW1vcDEpKTsKCiAgZWxzZSBpZiAocmVhbDEgJiYgcmVh bDIKCSAgICYmIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChwcmltb3Aw KSkKCSAgICAgICA9PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChwcmlt b3AxKSkpKQogICAgdHlwZSA9IFRSRUVfVFlQRSAocHJpbW9wMCk7CgogIC8q IElmIGFyZ3MnIG5hdHVyYWwgdHlwZXMgYXJlIGJvdGggbmFycm93ZXIgdGhh biBub21pbmFsIHR5cGUKICAgICBhbmQgYm90aCBleHRlbmQgaW4gdGhlIHNh bWUgbWFubmVyLCBjb21wYXJlIHRoZW0KICAgICBpbiB0aGUgdHlwZSBvZiB0 aGUgd2lkZXIgYXJnLgogICAgIE90aGVyd2lzZSBtdXN0IGFjdHVhbGx5IGV4 dGVuZCBib3RoIHRvIHRoZSBub21pbmFsCiAgICAgY29tbW9uIHR5cGUgbGVz dCBkaWZmZXJlbnQgd2F5cyBvZiBleHRlbmRpbmcKICAgICBhbHRlciB0aGUg cmVzdWx0LgogICAgIChlZywgKHNob3J0KS0xID09ICh1bnNpZ25lZCBzaG9y dCktMSAgc2hvdWxkIGJlIDAuKSAgKi8KCiAgZWxzZSBpZiAodW5zaWduZWRw MCA9PSB1bnNpZ25lZHAxICYmIHJlYWwxID09IHJlYWwyCgkgICAmJiBUWVBF X1BSRUNJU0lPTiAoVFJFRV9UWVBFIChwcmltb3AwKSkgPCBUWVBFX1BSRUNJ U0lPTiAoKnJlc3R5cGVfcHRyKQoJICAgJiYgVFlQRV9QUkVDSVNJT04gKFRS RUVfVFlQRSAocHJpbW9wMSkpIDwgVFlQRV9QUkVDSVNJT04gKCpyZXN0eXBl X3B0cikpCiAgICB7CiAgICAgIHR5cGUgPSBjb21tb25fdHlwZSAoVFJFRV9U WVBFIChwcmltb3AwKSwgVFJFRV9UWVBFIChwcmltb3AxKSk7CiAgICAgIHR5 cGUgPSBjX2NvbW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAodW5zaWdu ZWRwMAoJCQkJCSAgICAgICB8fCBUWVBFX1VOU0lHTkVEICgqcmVzdHlwZV9w dHIpLAoJCQkJCSAgICAgICB0eXBlKTsKICAgICAgLyogTWFrZSBzdXJlIHNo b3J0ZXIgb3BlcmFuZCBpcyBleHRlbmRlZCB0aGUgcmlnaHQgd2F5CgkgdG8g bWF0Y2ggdGhlIGxvbmdlciBvcGVyYW5kLiAgKi8KICAgICAgcHJpbW9wMAoJ PSBjb252ZXJ0IChjX2NvbW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAo dW5zaWduZWRwMCwKCQkJCQkJICAgICBUUkVFX1RZUEUgKHByaW1vcDApKSwK CQkgICBwcmltb3AwKTsKICAgICAgcHJpbW9wMQoJPSBjb252ZXJ0IChjX2Nv bW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAodW5zaWduZWRwMSwKCQkJ CQkJICAgICBUUkVFX1RZUEUgKHByaW1vcDEpKSwKCQkgICBwcmltb3AxKTsK ICAgIH0KICBlbHNlCiAgICB7CiAgICAgIC8qIEhlcmUgd2UgbXVzdCBkbyB0 aGUgY29tcGFyaXNvbiBvbiB0aGUgbm9taW5hbCB0eXBlCgkgdXNpbmcgdGhl IGFyZ3MgZXhhY3RseSBhcyB3ZSByZWNlaXZlZCB0aGVtLiAgKi8KICAgICAg dHlwZSA9ICpyZXN0eXBlX3B0cjsKICAgICAgcHJpbW9wMCA9IG9wMDsKICAg ICAgcHJpbW9wMSA9IG9wMTsKCiAgICAgIGlmICghcmVhbDEgJiYgIXJlYWwy ICYmIGludGVnZXJfemVyb3AgKHByaW1vcDEpCgkgICYmIFRZUEVfVU5TSUdO RUQgKCpyZXN0eXBlX3B0cikpCgl7CgkgIHRyZWUgdmFsdWUgPSAwOwoJICBz d2l0Y2ggKGNvZGUpCgkgICAgewoJICAgIGNhc2UgR0VfRVhQUjoKCSAgICAg IC8qIEFsbCB1bnNpZ25lZCB2YWx1ZXMgYXJlID49IDAsIHNvIHdlIHdhcm4u ICBIb3dldmVyLAoJCSBpZiBPUDAgaXMgYSBjb25zdGFudCB0aGF0IGlzID49 IDAsIHRoZSBzaWduZWRuZXNzIG9mCgkJIHRoZSBjb21wYXJpc29uIGlzbid0 IGFuIGlzc3VlLCBzbyBzdXBwcmVzcyB0aGUKCQkgd2FybmluZy4gICovCgkg ICAgICBpZiAod2Fybl90eXBlX2xpbWl0cyAmJiAhaW5fc3lzdGVtX2hlYWRl cgoJCSAgJiYgIShUUkVFX0NPREUgKHByaW1vcDApID09IElOVEVHRVJfQ1NU CgkJICAgICAgICYmICFUUkVFX09WRVJGTE9XIChjb252ZXJ0IChjX2NvbW1v bl9zaWduZWRfdHlwZSAodHlwZSksCgkJCQkJCSAgIHByaW1vcDApKSkpCgkJ d2FybmluZyAoT1BUX1d0eXBlX2xpbWl0cywgCgkJCSAiY29tcGFyaXNvbiBv ZiB1bnNpZ25lZCBleHByZXNzaW9uID49IDAgaXMgYWx3YXlzIHRydWUiKTsK CSAgICAgIHZhbHVlID0gdHJ1dGh2YWx1ZV90cnVlX25vZGU7CgkgICAgICBi cmVhazsKCgkgICAgY2FzZSBMVF9FWFBSOgoJICAgICAgaWYgKHdhcm5fdHlw ZV9saW1pdHMgJiYgIWluX3N5c3RlbV9oZWFkZXIKCQkgICYmICEoVFJFRV9D T0RFIChwcmltb3AwKSA9PSBJTlRFR0VSX0NTVAoJCSAgICAgICAmJiAhVFJF RV9PVkVSRkxPVyAoY29udmVydCAoY19jb21tb25fc2lnbmVkX3R5cGUgKHR5 cGUpLAoJCQkJCQkgICBwcmltb3AwKSkpKQoJCXdhcm5pbmcgKE9QVF9XdHlw ZV9saW1pdHMsIAoJCQkgImNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVz c2lvbiA8IDAgaXMgYWx3YXlzIGZhbHNlIik7CgkgICAgICB2YWx1ZSA9IHRy dXRodmFsdWVfZmFsc2Vfbm9kZTsKCSAgICAgIGJyZWFrOwoKCSAgICBkZWZh dWx0OgoJICAgICAgYnJlYWs7CgkgICAgfQoKCSAgaWYgKHZhbHVlICE9IDAp CgkgICAgewoJICAgICAgLyogRG9uJ3QgZm9yZ2V0IHRvIGV2YWx1YXRlIFBS SU1PUDAgaWYgaXQgaGFzIHNpZGUgZWZmZWN0cy4gICovCgkgICAgICBpZiAo VFJFRV9TSURFX0VGRkVDVFMgKHByaW1vcDApKQoJCXJldHVybiBidWlsZDIg KENPTVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAodmFsdWUpLAoJCQkgICAgICAg cHJpbW9wMCwgdmFsdWUpOwoJICAgICAgcmV0dXJuIHZhbHVlOwoJICAgIH0K CX0KICAgIH0KCiAgKm9wMF9wdHIgPSBjb252ZXJ0ICh0eXBlLCBwcmltb3Aw KTsKICAqb3AxX3B0ciA9IGNvbnZlcnQgKHR5cGUsIHByaW1vcDEpOwoKICAq cmVzdHlwZV9wdHIgPSB0cnV0aHZhbHVlX3R5cGVfbm9kZTsKCiAgcmV0dXJu IDA7Cn0KDAovKiBSZXR1cm4gYSB0cmVlIGZvciB0aGUgc3VtIG9yIGRpZmZl cmVuY2UgKFJFU1VMVENPREUgc2F5cyB3aGljaCkKICAgb2YgcG9pbnRlciBQ VFJPUCBhbmQgaW50ZWdlciBJTlRPUC4gICovCgp0cmVlCnBvaW50ZXJfaW50 X3N1bSAoZW51bSB0cmVlX2NvZGUgcmVzdWx0Y29kZSwgdHJlZSBwdHJvcCwg dHJlZSBpbnRvcCkKewogIHRyZWUgc2l6ZV9leHAsIHJldDsKCiAgLyogVGhl IHJlc3VsdCBpcyBhIHBvaW50ZXIgb2YgdGhlIHNhbWUgdHlwZSB0aGF0IGlz IGJlaW5nIGFkZGVkLiAgKi8KICB0cmVlIHJlc3VsdF90eXBlID0gVFJFRV9U WVBFIChwdHJvcCk7CgogIGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAocmVz dWx0X3R5cGUpKSA9PSBWT0lEX1RZUEUpCiAgICB7CiAgICAgIGlmIChwZWRh bnRpYyB8fCB3YXJuX3BvaW50ZXJfYXJpdGgpCglwZWR3YXJuICgicG9pbnRl ciBvZiB0eXBlICU8dm9pZCAqJT4gdXNlZCBpbiBhcml0aG1ldGljIik7CiAg ICAgIHNpemVfZXhwID0gaW50ZWdlcl9vbmVfbm9kZTsKICAgIH0KICBlbHNl IGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAocmVzdWx0X3R5cGUpKSA9PSBG VU5DVElPTl9UWVBFKQogICAgewogICAgICBpZiAocGVkYW50aWMgfHwgd2Fy bl9wb2ludGVyX2FyaXRoKQoJcGVkd2FybiAoInBvaW50ZXIgdG8gYSBmdW5j dGlvbiB1c2VkIGluIGFyaXRobWV0aWMiKTsKICAgICAgc2l6ZV9leHAgPSBp bnRlZ2VyX29uZV9ub2RlOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09ERSAo VFJFRV9UWVBFIChyZXN1bHRfdHlwZSkpID09IE1FVEhPRF9UWVBFKQogICAg ewogICAgICBpZiAocGVkYW50aWMgfHwgd2Fybl9wb2ludGVyX2FyaXRoKQoJ cGVkd2FybiAoInBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHVzZWQgaW4g YXJpdGhtZXRpYyIpOwogICAgICBzaXplX2V4cCA9IGludGVnZXJfb25lX25v ZGU7CiAgICB9CiAgZWxzZQogICAgc2l6ZV9leHAgPSBzaXplX2luX2J5dGVz IChUUkVFX1RZUEUgKHJlc3VsdF90eXBlKSk7CgogIC8qIFdlIGFyZSBtYW5p cHVsYXRpbmcgcG9pbnRlciB2YWx1ZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8g d2FybgogICAgIGFib3V0IHJlbHlpbmcgb24gdW5kZWZpbmVkIHNpZ25lZCBv dmVyZmxvdy4gIFdlIGRpc2FibGUgdGhlCiAgICAgd2FybmluZyBoZXJlIGJl Y2F1c2Ugd2UgdXNlIGludGVnZXIgdHlwZXMgc28gZm9sZCB3b24ndCBrbm93 IHRoYXQKICAgICB0aGV5IGFyZSByZWFsbHkgcG9pbnRlcnMuICAqLwogIGZv bGRfZGVmZXJfb3ZlcmZsb3dfd2FybmluZ3MgKCk7CgogIC8qIElmIHdoYXQg d2UgYXJlIGFib3V0IHRvIG11bHRpcGx5IGJ5IHRoZSBzaXplIG9mIHRoZSBl bGVtZW50cwogICAgIGNvbnRhaW5zIGEgY29uc3RhbnQgdGVybSwgYXBwbHkg ZGlzdHJpYnV0aXZlIGxhdwogICAgIGFuZCBtdWx0aXBseSB0aGF0IGNvbnN0 YW50IHRlcm0gc2VwYXJhdGVseS4KICAgICBUaGlzIGhlbHBzIHByb2R1Y2Ug Y29tbW9uIHN1YmV4cHJlc3Npb25zLiAgKi8KICBpZiAoKFRSRUVfQ09ERSAo aW50b3ApID09IFBMVVNfRVhQUiB8fCBUUkVFX0NPREUgKGludG9wKSA9PSBN SU5VU19FWFBSKQogICAgICAmJiAhVFJFRV9DT05TVEFOVCAoaW50b3ApCiAg ICAgICYmIFRSRUVfQ09OU1RBTlQgKFRSRUVfT1BFUkFORCAoaW50b3AsIDEp KQogICAgICAmJiBUUkVFX0NPTlNUQU5UIChzaXplX2V4cCkKICAgICAgLyog SWYgdGhlIGNvbnN0YW50IGNvbWVzIGZyb20gcG9pbnRlciBzdWJ0cmFjdGlv biwKCSBza2lwIHRoaXMgb3B0aW1pemF0aW9uLS1pdCB3b3VsZCBjYXVzZSBh biBlcnJvci4gICovCiAgICAgICYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChU UkVFX09QRVJBTkQgKGludG9wLCAwKSkpID09IElOVEVHRVJfVFlQRQogICAg ICAvKiBJZiB0aGUgY29uc3RhbnQgaXMgdW5zaWduZWQsIGFuZCBzbWFsbGVy IHRoYW4gdGhlIHBvaW50ZXIgc2l6ZSwKCSB0aGVuIHdlIG11c3Qgc2tpcCB0 aGlzIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgYmVjYXVzZSBpdCBjb3VsZCBj YXVzZQoJIGFuIG92ZXJmbG93IGVycm9yIGlmIHRoZSBjb25zdGFudCBpcyBu ZWdhdGl2ZSBidXQgSU5UT1AgaXMgbm90LiAgKi8KICAgICAgJiYgKCFUWVBF X1VOU0lHTkVEIChUUkVFX1RZUEUgKGludG9wKSkKCSAgfHwgKFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKGludG9wKSkKCSAgICAgID09IFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKHB0cm9wKSkpKSkKICAgIHsKICAgICAgZW51 bSB0cmVlX2NvZGUgc3ViY29kZSA9IHJlc3VsdGNvZGU7CiAgICAgIHRyZWUg aW50X3R5cGUgPSBUUkVFX1RZUEUgKGludG9wKTsKICAgICAgaWYgKFRSRUVf Q09ERSAoaW50b3ApID09IE1JTlVTX0VYUFIpCglzdWJjb2RlID0gKHN1YmNv ZGUgPT0gUExVU19FWFBSID8gTUlOVVNfRVhQUiA6IFBMVVNfRVhQUik7CiAg ICAgIC8qIENvbnZlcnQgYm90aCBzdWJleHByZXNzaW9uIHR5cGVzIHRvIHRo ZSB0eXBlIG9mIGludG9wLAoJIGJlY2F1c2Ugd2VpcmQgY2FzZXMgaW52b2x2 aW5nIHBvaW50ZXIgYXJpdGhtZXRpYwoJIGNhbiByZXN1bHQgaW4gYSBzdW0g b3IgZGlmZmVyZW5jZSB3aXRoIGRpZmZlcmVudCB0eXBlIGFyZ3MuICAqLwog ICAgICBwdHJvcCA9IGJ1aWxkX2JpbmFyeV9vcCAoc3ViY29kZSwgcHRyb3As CgkJCSAgICAgICBjb252ZXJ0IChpbnRfdHlwZSwgVFJFRV9PUEVSQU5EIChp bnRvcCwgMSkpLCAxKTsKICAgICAgaW50b3AgPSBjb252ZXJ0IChpbnRfdHlw ZSwgVFJFRV9PUEVSQU5EIChpbnRvcCwgMCkpOwogICAgfQoKICAvKiBDb252 ZXJ0IHRoZSBpbnRlZ2VyIGFyZ3VtZW50IHRvIGEgdHlwZSB0aGUgc2FtZSBz aXplIGFzIHNpemV0eXBlCiAgICAgc28gdGhlIG11bHRpcGx5IHdvbid0IG92 ZXJmbG93IHNwdXJpb3VzbHkuICAqLwogIGlmIChUWVBFX1BSRUNJU0lPTiAo VFJFRV9UWVBFIChpbnRvcCkpICE9IFRZUEVfUFJFQ0lTSU9OIChzaXpldHlw ZSkKICAgICAgfHwgVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChpbnRvcCkp ICE9IFRZUEVfVU5TSUdORUQgKHNpemV0eXBlKSkKICAgIGludG9wID0gY29u dmVydCAoY19jb21tb25fdHlwZV9mb3Jfc2l6ZSAoVFlQRV9QUkVDSVNJT04g KHNpemV0eXBlKSwKCQkJCQkgICAgIFRZUEVfVU5TSUdORUQgKHNpemV0eXBl KSksIGludG9wKTsKCiAgLyogUmVwbGFjZSB0aGUgaW50ZWdlciBhcmd1bWVu dCB3aXRoIGEgc3VpdGFibGUgcHJvZHVjdCBieSB0aGUgb2JqZWN0IHNpemUu CiAgICAgRG8gdGhpcyBtdWx0aXBsaWNhdGlvbiBhcyBzaWduZWQsIHRoZW4g Y29udmVydCB0byB0aGUgYXBwcm9wcmlhdGUKICAgICB0eXBlIGZvciB0aGUg cG9pbnRlciBvcGVyYXRpb24uICAqLwogIGludG9wID0gY29udmVydCAoc2l6 ZXR5cGUsCgkJICAgYnVpbGRfYmluYXJ5X29wIChNVUxUX0VYUFIsIGludG9w LAoJCQkJICAgIGNvbnZlcnQgKFRSRUVfVFlQRSAoaW50b3ApLCBzaXplX2V4 cCksIDEpKTsKCiAgLyogQ3JlYXRlIHRoZSBzdW0gb3IgZGlmZmVyZW5jZS4g ICovCiAgaWYgKHJlc3VsdGNvZGUgPT0gTUlOVVNfRVhQUikKICAgIGludG9w ID0gZm9sZF9idWlsZDEgKE5FR0FURV9FWFBSLCBzaXpldHlwZSwgaW50b3Ap OwoKICByZXQgPSBmb2xkX2J1aWxkMiAoUE9JTlRFUl9QTFVTX0VYUFIsIHJl c3VsdF90eXBlLCBwdHJvcCwgaW50b3ApOwoKICBmb2xkX3VuZGVmZXJfYW5k X2lnbm9yZV9vdmVyZmxvd193YXJuaW5ncyAoKTsKCiAgcmV0dXJuIHJldDsK fQoMCi8qIFJldHVybiB3aGV0aGVyIEVYUFIgaXMgYSBkZWNsYXJhdGlvbiB3 aG9zZSBhZGRyZXNzIGNhbiBuZXZlciBiZQogICBOVUxMLiAgKi8KCmJvb2wK ZGVjbF93aXRoX25vbm51bGxfYWRkcl9wIChjb25zdF90cmVlIGV4cHIpCnsK ICByZXR1cm4gKERFQ0xfUCAoZXhwcikKCSAgJiYgKFRSRUVfQ09ERSAoZXhw cikgPT0gUEFSTV9ERUNMCgkgICAgICB8fCBUUkVFX0NPREUgKGV4cHIpID09 IExBQkVMX0RFQ0wKCSAgICAgIHx8ICFERUNMX1dFQUsgKGV4cHIpKSk7Cn0K Ci8qIFByZXBhcmUgZXhwciB0byBiZSBhbiBhcmd1bWVudCBvZiBhIFRSVVRI X05PVF9FWFBSLAogICBvciBmb3IgYW4gYGlmJyBvciBgd2hpbGUnIHN0YXRl bWVudCBvciA/Li46IGV4cC4gIEl0IHNob3VsZCBhbHJlYWR5CiAgIGhhdmUg YmVlbiB2YWxpZGF0ZWQgdG8gYmUgb2Ygc3VpdGFibGUgdHlwZTsgb3RoZXJ3 aXNlLCBhIGJhZAogICBkaWFnbm9zdGljIG1heSByZXN1bHQuCgogICBUaGlz IHByZXBhcmF0aW9uIGNvbnNpc3RzIG9mIHRha2luZyB0aGUgb3JkaW5hcnkK ICAgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBleHByIGFuZCBw cm9kdWNpbmcgYSB2YWxpZCB0cmVlCiAgIGJvb2xlYW4gZXhwcmVzc2lvbiBk ZXNjcmliaW5nIHdoZXRoZXIgZXhwciBpcyBub256ZXJvLiAgV2UgY291bGQK ICAgc2ltcGx5IGFsd2F5cyBkbyBidWlsZF9iaW5hcnlfb3AgKE5FX0VYUFIs IGV4cHIsIHRydXRodmFsdWVfZmFsc2Vfbm9kZSwgMSksCiAgIGJ1dCB3ZSBv cHRpbWl6ZSBjb21wYXJpc29ucywgJiYsIHx8LCBhbmQgIS4KCiAgIFRoZSBy ZXN1bHRpbmcgdHlwZSBzaG91bGQgYWx3YXlzIGJlIGB0cnV0aHZhbHVlX3R5 cGVfbm9kZScuICAqLwoKdHJlZQpjX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZl cnNpb24gKHRyZWUgZXhwcikKewogIHN3aXRjaCAoVFJFRV9DT0RFIChleHBy KSkKICAgIHsKICAgIGNhc2UgRVFfRVhQUjogICBjYXNlIE5FX0VYUFI6ICAg Y2FzZSBVTkVRX0VYUFI6IGNhc2UgTFRHVF9FWFBSOgogICAgY2FzZSBMRV9F WFBSOiAgIGNhc2UgR0VfRVhQUjogICBjYXNlIExUX0VYUFI6ICAgY2FzZSBH VF9FWFBSOgogICAgY2FzZSBVTkxFX0VYUFI6IGNhc2UgVU5HRV9FWFBSOiBj YXNlIFVOTFRfRVhQUjogY2FzZSBVTkdUX0VYUFI6CiAgICBjYXNlIE9SREVS RURfRVhQUjogY2FzZSBVTk9SREVSRURfRVhQUjoKICAgICAgaWYgKFRSRUVf VFlQRSAoZXhwcikgPT0gdHJ1dGh2YWx1ZV90eXBlX25vZGUpCglyZXR1cm4g ZXhwcjsKICAgICAgcmV0dXJuIGJ1aWxkMiAoVFJFRV9DT0RFIChleHByKSwg dHJ1dGh2YWx1ZV90eXBlX25vZGUsCgkJICAgICBUUkVFX09QRVJBTkQgKGV4 cHIsIDApLCBUUkVFX09QRVJBTkQgKGV4cHIsIDEpKTsKCiAgICBjYXNlIFRS VVRIX0FORElGX0VYUFI6CiAgICBjYXNlIFRSVVRIX09SSUZfRVhQUjoKICAg IGNhc2UgVFJVVEhfQU5EX0VYUFI6CiAgICBjYXNlIFRSVVRIX09SX0VYUFI6 CiAgICBjYXNlIFRSVVRIX1hPUl9FWFBSOgogICAgICBpZiAoVFJFRV9UWVBF IChleHByKSA9PSB0cnV0aHZhbHVlX3R5cGVfbm9kZSkKCXJldHVybiBleHBy OwogICAgICByZXR1cm4gYnVpbGQyIChUUkVFX0NPREUgKGV4cHIpLCB0cnV0 aHZhbHVlX3R5cGVfbm9kZSwKCQkgY19jb21tb25fdHJ1dGh2YWx1ZV9jb252 ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSwKCQkgY19jb21tb25f dHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDEp KSk7CgogICAgY2FzZSBUUlVUSF9OT1RfRVhQUjoKICAgICAgaWYgKFRSRUVf VFlQRSAoZXhwcikgPT0gdHJ1dGh2YWx1ZV90eXBlX25vZGUpCglyZXR1cm4g ZXhwcjsKICAgICAgcmV0dXJuIGJ1aWxkMSAoVFJFRV9DT0RFIChleHByKSwg dHJ1dGh2YWx1ZV90eXBlX25vZGUsCgkJIGNfY29tbW9uX3RydXRodmFsdWVf Y29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpOwoKICAgIGNh c2UgRVJST1JfTUFSSzoKICAgICAgcmV0dXJuIGV4cHI7CgogICAgY2FzZSBJ TlRFR0VSX0NTVDoKICAgICAgcmV0dXJuIGludGVnZXJfemVyb3AgKGV4cHIp ID8gdHJ1dGh2YWx1ZV9mYWxzZV9ub2RlCgkJCQkgIDogdHJ1dGh2YWx1ZV90 cnVlX25vZGU7CgogICAgY2FzZSBSRUFMX0NTVDoKICAgICAgcmV0dXJuIHJl YWxfY29tcGFyZSAoTkVfRVhQUiwgJlRSRUVfUkVBTF9DU1QgKGV4cHIpLCAm ZGNvbnN0MCkKCSAgICAgPyB0cnV0aHZhbHVlX3RydWVfbm9kZQoJICAgICA6 IHRydXRodmFsdWVfZmFsc2Vfbm9kZTsKCiAgICBjYXNlIEZJWEVEX0NTVDoK ICAgICAgcmV0dXJuIGZpeGVkX2NvbXBhcmUgKE5FX0VYUFIsICZUUkVFX0ZJ WEVEX0NTVCAoZXhwciksCgkJCSAgICAmRkNPTlNUMCAoVFlQRV9NT0RFIChU UkVFX1RZUEUgKGV4cHIpKSkpCgkgICAgID8gdHJ1dGh2YWx1ZV90cnVlX25v ZGUKCSAgICAgOiB0cnV0aHZhbHVlX2ZhbHNlX25vZGU7CgogICAgY2FzZSBG VU5DVElPTl9ERUNMOgogICAgICBleHByID0gYnVpbGRfdW5hcnlfb3AgKEFE RFJfRVhQUiwgZXhwciwgMCk7CiAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICov CgogICAgY2FzZSBBRERSX0VYUFI6CiAgICAgIHsKIAl0cmVlIGlubmVyID0g VFJFRV9PUEVSQU5EIChleHByLCAwKTsKCWlmIChkZWNsX3dpdGhfbm9ubnVs bF9hZGRyX3AgKGlubmVyKSkKCSAgewoJICAgIC8qIENvbW1vbiBBZGEvUGFz Y2FsIHByb2dyYW1tZXIncyBtaXN0YWtlLiAgKi8KCSAgICB3YXJuaW5nIChP UFRfV2FkZHJlc3MsCgkJICAgICAidGhlIGFkZHJlc3Mgb2YgJXFEIHdpbGwg YWx3YXlzIGV2YWx1YXRlIGFzICU8dHJ1ZSU+IiwKCQkgICAgIGlubmVyKTsK CSAgICByZXR1cm4gdHJ1dGh2YWx1ZV90cnVlX25vZGU7CgkgIH0KCgkvKiBJ ZiB3ZSBzdGlsbCBoYXZlIGEgZGVjbCwgaXQgaXMgcG9zc2libGUgZm9yIGl0 cyBhZGRyZXNzIHRvCgkgICBiZSBOVUxMLCBzbyB3ZSBjYW5ub3Qgb3B0aW1p emUuICAqLwoJaWYgKERFQ0xfUCAoaW5uZXIpKQoJICB7CgkgICAgZ2NjX2Fz c2VydCAoREVDTF9XRUFLIChpbm5lcikpOwoJICAgIGJyZWFrOwoJICB9CgoJ aWYgKFRSRUVfU0lERV9FRkZFQ1RTIChpbm5lcikpCgkgIHJldHVybiBidWls ZDIgKENPTVBPVU5EX0VYUFIsIHRydXRodmFsdWVfdHlwZV9ub2RlLAoJCQkg aW5uZXIsIHRydXRodmFsdWVfdHJ1ZV9ub2RlKTsKCWVsc2UKCSAgcmV0dXJu IHRydXRodmFsdWVfdHJ1ZV9ub2RlOwogICAgICB9CgogICAgY2FzZSBDT01Q TEVYX0VYUFI6CiAgICAgIHJldHVybiBidWlsZF9iaW5hcnlfb3AgKChUUkVF X1NJREVfRUZGRUNUUyAoVFJFRV9PUEVSQU5EIChleHByLCAxKSkKCQkJICAg ICAgID8gVFJVVEhfT1JfRVhQUiA6IFRSVVRIX09SSUZfRVhQUiksCgkJY19j b21tb25fdHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4 cHIsIDApKSwKCQljX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZlcnNpb24gKFRS RUVfT1BFUkFORCAoZXhwciwgMSkpLAoJCQkgICAgICAwKTsKCiAgICBjYXNl IE5FR0FURV9FWFBSOgogICAgY2FzZSBBQlNfRVhQUjoKICAgIGNhc2UgRkxP QVRfRVhQUjoKICAgICAgLyogVGhlc2UgZG9uJ3QgY2hhbmdlIHdoZXRoZXIg YW4gb2JqZWN0IGlzIG5vbnplcm8gb3IgemVyby4gICovCiAgICAgIHJldHVy biBjX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZlcnNpb24gKFRSRUVfT1BFUkFO RCAoZXhwciwgMCkpOwoKICAgIGNhc2UgTFJPVEFURV9FWFBSOgogICAgY2Fz ZSBSUk9UQVRFX0VYUFI6CiAgICAgIC8qIFRoZXNlIGRvbid0IGNoYW5nZSB3 aGV0aGVyIGFuIG9iamVjdCBpcyB6ZXJvIG9yIG5vbnplcm8sIGJ1dAoJIHdl IGNhbid0IGlnbm9yZSB0aGVtIGlmIHRoZWlyIHNlY29uZCBhcmcgaGFzIHNp ZGUtZWZmZWN0cy4gICovCiAgICAgIGlmIChUUkVFX1NJREVfRUZGRUNUUyAo VFJFRV9PUEVSQU5EIChleHByLCAxKSkpCglyZXR1cm4gYnVpbGQyIChDT01Q T1VORF9FWFBSLCB0cnV0aHZhbHVlX3R5cGVfbm9kZSwKCQkgICAgICAgVFJF RV9PUEVSQU5EIChleHByLCAxKSwKCQkgICAgICAgY19jb21tb25fdHJ1dGh2 YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSk7CiAg ICAgIGVsc2UKCXJldHVybiBjX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZlcnNp b24gKFRSRUVfT1BFUkFORCAoZXhwciwgMCkpOwoKICAgIGNhc2UgQ09ORF9F WFBSOgogICAgICAvKiBEaXN0cmlidXRlIHRoZSBjb252ZXJzaW9uIGludG8g dGhlIGFybXMgb2YgYSBDT05EX0VYUFIuICAqLwogICAgICByZXR1cm4gZm9s ZF9idWlsZDMgKENPTkRfRVhQUiwgdHJ1dGh2YWx1ZV90eXBlX25vZGUsCgkJ VFJFRV9PUEVSQU5EIChleHByLCAwKSwKCQljX2NvbW1vbl90cnV0aHZhbHVl X2NvbnZlcnNpb24gKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpLAoJCWNfY29t bW9uX3RydXRodmFsdWVfY29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHBy LCAyKSkpOwoKICAgIGNhc2UgQ09OVkVSVF9FWFBSOgogICAgY2FzZSBOT1Bf RVhQUjoKICAgICAgLyogRG9uJ3QgY2FuY2VsIHRoZSBlZmZlY3Qgb2YgYSBD T05WRVJUX0VYUFIgZnJvbSBhIFJFRkVSRU5DRV9UWVBFLAoJIHNpbmNlIHRo YXQgYWZmZWN0cyBob3cgYGRlZmF1bHRfY29udmVyc2lvbicgd2lsbCBiZWhh dmUuICAqLwogICAgICBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIp KSA9PSBSRUZFUkVOQ0VfVFlQRQoJICB8fCBUUkVFX0NPREUgKFRSRUVfVFlQ RSAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpID09IFJFRkVSRU5DRV9UWVBF KQoJYnJlYWs7CiAgICAgIC8qIElmIHRoaXMgaXMgd2lkZW5pbmcgdGhlIGFy Z3VtZW50LCB3ZSBjYW4gaWdub3JlIGl0LiAgKi8KICAgICAgaWYgKFRZUEVf UFJFQ0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKQoJICA+PSBUWVBFX1BSRUNJ U0lPTiAoVFJFRV9UWVBFIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSkpCgly ZXR1cm4gY19jb21tb25fdHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChUUkVFX09Q RVJBTkQgKGV4cHIsIDApKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNT0RJ RllfRVhQUjoKICAgICAgaWYgKCFUUkVFX05PX1dBUk5JTkcgKGV4cHIpCgkg ICYmIHdhcm5fcGFyZW50aGVzZXMpCgl7CgkgIHdhcm5pbmcgKE9QVF9XcGFy ZW50aGVzZXMsCgkJICAgInN1Z2dlc3QgcGFyZW50aGVzZXMgYXJvdW5kIGFz c2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZSIpOwoJICBUUkVFX05PX1dB Uk5JTkcgKGV4cHIpID0gMTsKCX0KICAgICAgYnJlYWs7CgogICAgZGVmYXVs dDoKICAgICAgYnJlYWs7CiAgICB9CgogIGlmIChUUkVFX0NPREUgKFRSRUVf VFlQRSAoZXhwcikpID09IENPTVBMRVhfVFlQRSkKICAgIHsKICAgICAgdHJl ZSB0ID0gc2F2ZV9leHByIChleHByKTsKICAgICAgcmV0dXJuIChidWlsZF9i aW5hcnlfb3AKCSAgICAgICgoVFJFRV9TSURFX0VGRkVDVFMgKGV4cHIpCgkJ PyBUUlVUSF9PUl9FWFBSIDogVFJVVEhfT1JJRl9FWFBSKSwKCWNfY29tbW9u X3RydXRodmFsdWVfY29udmVyc2lvbiAoYnVpbGRfdW5hcnlfb3AgKFJFQUxQ QVJUX0VYUFIsIHQsIDApKSwKCWNfY29tbW9uX3RydXRodmFsdWVfY29udmVy c2lvbiAoYnVpbGRfdW5hcnlfb3AgKElNQUdQQVJUX0VYUFIsIHQsIDApKSwK CSAgICAgICAwKSk7CiAgICB9CgogIGlmIChUUkVFX0NPREUgKFRSRUVfVFlQ RSAoZXhwcikpID09IEZJWEVEX1BPSU5UX1RZUEUpCiAgICB7CiAgICAgIHRy ZWUgZml4ZWRfemVyb19ub2RlID0gYnVpbGRfZml4ZWQgKFRSRUVfVFlQRSAo ZXhwciksCgkJCQkJICBGQ09OU1QwIChUWVBFX01PREUKCQkJCQkJICAgKFRS RUVfVFlQRSAoZXhwcikpKSk7CiAgICAgIHJldHVybiBidWlsZF9iaW5hcnlf b3AgKE5FX0VYUFIsIGV4cHIsIGZpeGVkX3plcm9fbm9kZSwgMSk7CiAgICB9 CgogIHJldHVybiBidWlsZF9iaW5hcnlfb3AgKE5FX0VYUFIsIGV4cHIsIGlu dGVnZXJfemVyb19ub2RlLCAxKTsKfQoMCnN0YXRpYyB2b2lkIGRlZl9idWls dGluXzEgIChlbnVtIGJ1aWx0X2luX2Z1bmN0aW9uIGZuY29kZSwKCQkJICAg IGNvbnN0IGNoYXIgKm5hbWUsCgkJCSAgICBlbnVtIGJ1aWx0X2luX2NsYXNz IGZuY2xhc3MsCgkJCSAgICB0cmVlIGZudHlwZSwgdHJlZSBsaWJ0eXBlLAoJ CQkgICAgYm9vbCBib3RoX3AsIGJvb2wgZmFsbGJhY2tfcCwgYm9vbCBub25h bnNpX3AsCgkJCSAgICB0cmVlIGZuYXR0cnMsIGJvb2wgaW1wbGljaXRfcCk7 CgoKLyogQXBwbHkgdGhlIFRZUEVfUVVBTFMgdG8gdGhlIG5ldyBERUNMLiAg Ki8KCnZvaWQKY19hcHBseV90eXBlX3F1YWxzX3RvX2RlY2wgKGludCB0eXBl X3F1YWxzLCB0cmVlIGRlY2wpCnsKICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUg KGRlY2wpOwoKICBpZiAodHlwZSA9PSBlcnJvcl9tYXJrX25vZGUpCiAgICBy ZXR1cm47CgogIGlmICgoKHR5cGVfcXVhbHMgJiBUWVBFX1FVQUxfQ09OU1Qp CiAgICAgICB8fCAodHlwZSAmJiBUUkVFX0NPREUgKHR5cGUpID09IFJFRkVS RU5DRV9UWVBFKSkKICAgICAgLyogQW4gb2JqZWN0IGRlY2xhcmVkICdjb25z dCcgaXMgb25seSByZWFkb25seSBhZnRlciBpdCBpcwoJIGluaXRpYWxpemVk LiAgV2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IG9mIGV4cHJlc3NpbmcgdGhpcyBj dXJyZW50bHksCgkgc28gd2UgbmVlZCB0byBiZSBjb25zZXJ2YXRpdmUgYW5k IHVuc2V0IFRSRUVfUkVBRE9OTFkgZm9yIHR5cGVzCgkgd2l0aCBjb25zdHJ1 Y3RvcnMuICBPdGhlcndpc2UgYWxpYXNpbmcgY29kZSB3aWxsIGlnbm9yZSBz dG9yZXMgaW4KCSBhbiBpbmxpbmUgY29uc3RydWN0b3IuICAqLwogICAgICAm JiAhKHR5cGUgJiYgVFlQRV9ORUVEU19DT05TVFJVQ1RJTkcgKHR5cGUpKSkK ICAgIFRSRUVfUkVBRE9OTFkgKGRlY2wpID0gMTsKICBpZiAodHlwZV9xdWFs cyAmIFRZUEVfUVVBTF9WT0xBVElMRSkKICAgIHsKICAgICAgVFJFRV9TSURF X0VGRkVDVFMgKGRlY2wpID0gMTsKICAgICAgVFJFRV9USElTX1ZPTEFUSUxF IChkZWNsKSA9IDE7CiAgICB9CiAgaWYgKHR5cGVfcXVhbHMgJiBUWVBFX1FV QUxfUkVTVFJJQ1QpCiAgICB7CiAgICAgIHdoaWxlICh0eXBlICYmIFRSRUVf Q09ERSAodHlwZSkgPT0gQVJSQVlfVFlQRSkKCS8qIEFsbG93ICdyZXN0cmlj dCcgb24gYXJyYXlzIG9mIHBvaW50ZXJzLgoJICAgRklYTUUgY3VycmVudGx5 IHdlIGp1c3QgaWdub3JlIGl0LiAgKi8KCXR5cGUgPSBUUkVFX1RZUEUgKHR5 cGUpOwogICAgICBpZiAoIXR5cGUKCSAgfHwgIVBPSU5URVJfVFlQRV9QICh0 eXBlKQoJICB8fCAhQ19UWVBFX09CSkVDVF9PUl9JTkNPTVBMRVRFX1AgKFRS RUVfVFlQRSAodHlwZSkpKQoJZXJyb3IgKCJpbnZhbGlkIHVzZSBvZiAlPHJl c3RyaWN0JT4iKTsKICAgICAgZWxzZSBpZiAoZmxhZ19zdHJpY3RfYWxpYXNp bmcgJiYgdHlwZSA9PSBUUkVFX1RZUEUgKGRlY2wpKQoJLyogSW5kaWNhdGUg d2UgbmVlZCB0byBtYWtlIGEgdW5pcXVlIGFsaWFzIHNldCBmb3IgdGhpcyBw b2ludGVyLgoJICAgV2UgY2FuJ3QgZG8gaXQgaGVyZSBiZWNhdXNlIGl0IG1p Z2h0IGJlIHBvaW50aW5nIHRvIGFuCgkgICBpbmNvbXBsZXRlIHR5cGUuICAq LwoJREVDTF9QT0lOVEVSX0FMSUFTX1NFVCAoZGVjbCkgPSAtMjsKICAgIH0K fQoKLyogSGFzaCBmdW5jdGlvbiBmb3IgdGhlIHByb2JsZW0gb2YgbXVsdGlw bGUgdHlwZSBkZWZpbml0aW9ucyBpbgogICBkaWZmZXJlbnQgZmlsZXMuICBU aGlzIG11c3QgaGFzaCBhbGwgdHlwZXMgdGhhdCB3aWxsIGNvbXBhcmUKICAg ZXF1YWwgdmlhIGNvbXB0eXBlcyB0byB0aGUgc2FtZSB2YWx1ZS4gIEluIHBy YWN0aWNlIGl0IGhhc2hlcwogICBvbiBzb21lIG9mIHRoZSBzaW1wbGUgc3R1 ZmYgYW5kIGxlYXZlcyB0aGUgZGV0YWlscyB0byBjb21wdHlwZXMuICAqLwoK c3RhdGljIGhhc2h2YWxfdApjX3R5cGVfaGFzaCAoY29uc3Qgdm9pZCAqcCkK ewogIGludCBpID0gMDsKICBpbnQgc2hpZnQsIHNpemU7CiAgY29uc3RfdHJl ZSBjb25zdCB0ID0gKGNvbnN0X3RyZWUpIHA7CiAgdHJlZSB0MjsKICBzd2l0 Y2ggKFRSRUVfQ09ERSAodCkpCiAgICB7CiAgICAvKiBGb3IgcG9pbnRlcnMs IGhhc2ggb24gcG9pbnRlZSB0eXBlIHBsdXMgc29tZSBzd2l6emxpbmcuICAq LwogICAgY2FzZSBQT0lOVEVSX1RZUEU6CiAgICAgIHJldHVybiBjX3R5cGVf aGFzaCAoVFJFRV9UWVBFICh0KSkgXiAweDMwMDMwMDM7CiAgICAvKiBIYXNo IG9uIG51bWJlciBvZiBlbGVtZW50cyBhbmQgdG90YWwgc2l6ZS4gICovCiAg ICBjYXNlIEVOVU1FUkFMX1RZUEU6CiAgICAgIHNoaWZ0ID0gMzsKICAgICAg dDIgPSBUWVBFX1ZBTFVFUyAodCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBS RUNPUkRfVFlQRToKICAgICAgc2hpZnQgPSAwOwogICAgICB0MiA9IFRZUEVf RklFTERTICh0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFFVQUxfVU5JT05f VFlQRToKICAgICAgc2hpZnQgPSAxOwogICAgICB0MiA9IFRZUEVfRklFTERT ICh0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFVOSU9OX1RZUEU6CiAgICAg IHNoaWZ0ID0gMjsKICAgICAgdDIgPSBUWVBFX0ZJRUxEUyAodCk7CiAgICAg IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZ2NjX3VucmVhY2hhYmxlICgp OwogICAgfQogIGZvciAoOyB0MjsgdDIgPSBUUkVFX0NIQUlOICh0MikpCiAg ICBpKys7CiAgc2l6ZSA9IFRSRUVfSU5UX0NTVF9MT1cgKFRZUEVfU0laRSAo dCkpOwogIHJldHVybiAoKHNpemUgPDwgMjQpIHwgKGkgPDwgc2hpZnQpKTsK fQoKc3RhdGljIEdUWSgocGFyYW1faXMgKHVuaW9uIHRyZWVfbm9kZSkpKSBo dGFiX3QgdHlwZV9oYXNoX3RhYmxlOwoKLyogUmV0dXJuIHRoZSB0eXBlZC1i YXNlZCBhbGlhcyBzZXQgZm9yIFQsIHdoaWNoIG1heSBiZSBhbiBleHByZXNz aW9uCiAgIG9yIGEgdHlwZS4gIFJldHVybiAtMSBpZiB3ZSBkb24ndCBkbyBh bnl0aGluZyBzcGVjaWFsLiAgKi8KCmFsaWFzX3NldF90eXBlCmNfY29tbW9u X2dldF9hbGlhc19zZXQgKHRyZWUgdCkKewogIHRyZWUgdTsKICBQVFIgKnNs b3Q7CgogIC8qIFBlcm1pdCB0eXBlLXB1bm5pbmcgd2hlbiBhY2Nlc3Npbmcg YSB1bmlvbiwgcHJvdmlkZWQgdGhlIGFjY2VzcwogICAgIGlzIGRpcmVjdGx5 IHRocm91Z2ggdGhlIHVuaW9uLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBk b2VzIG5vdAogICAgIHBlcm1pdCB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSB1 bmlvbiBtZW1iZXIgYW5kIHRoZW4gc3RvcmluZwogICAgIHRocm91Z2ggaXQu ICBFdmVuIHRoZSB0eXBlLXB1bm5pbmcgYWxsb3dlZCBoZXJlIGlzIGEgR0ND CiAgICAgZXh0ZW5zaW9uLCBhbGJlaXQgYSBjb21tb24gYW5kIHVzZWZ1bCBv bmU7IHRoZSBDIHN0YW5kYXJkIHNheXMKICAgICB0aGF0IHN1Y2ggYWNjZXNz ZXMgaGF2ZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGJlaGF2aW9yLiAgKi8K ICBmb3IgKHUgPSB0OwogICAgICAgVFJFRV9DT0RFICh1KSA9PSBDT01QT05F TlRfUkVGIHx8IFRSRUVfQ09ERSAodSkgPT0gQVJSQVlfUkVGOwogICAgICAg dSA9IFRSRUVfT1BFUkFORCAodSwgMCkpCiAgICBpZiAoVFJFRV9DT0RFICh1 KSA9PSBDT01QT05FTlRfUkVGCgkmJiBUUkVFX0NPREUgKFRSRUVfVFlQRSAo VFJFRV9PUEVSQU5EICh1LCAwKSkpID09IFVOSU9OX1RZUEUpCiAgICAgIHJl dHVybiAwOwoKICAvKiBUaGF0J3MgYWxsIHRoZSBleHByZXNzaW9ucyB3ZSBo YW5kbGUgc3BlY2lhbGx5LiAgKi8KICBpZiAoIVRZUEVfUCAodCkpCiAgICBy ZXR1cm4gLTE7CgogIC8qIFRoZSBDIHN0YW5kYXJkIGd1YXJhbnRlZXMgdGhh dCBhbnkgb2JqZWN0IG1heSBiZSBhY2Nlc3NlZCB2aWEgYW4KICAgICBsdmFs dWUgdGhhdCBoYXMgY2hhcmFjdGVyIHR5cGUuICAqLwogIGlmICh0ID09IGNo YXJfdHlwZV9ub2RlCiAgICAgIHx8IHQgPT0gc2lnbmVkX2NoYXJfdHlwZV9u b2RlCiAgICAgIHx8IHQgPT0gdW5zaWduZWRfY2hhcl90eXBlX25vZGUpCiAg ICByZXR1cm4gMDsKCiAgLyogSWYgaXQgaGFzIHRoZSBtYXlfYWxpYXMgYXR0 cmlidXRlLCBpdCBjYW4gYWxpYXMgYW55dGhpbmcuICAqLwogIGlmIChsb29r dXBfYXR0cmlidXRlICgibWF5X2FsaWFzIiwgVFlQRV9BVFRSSUJVVEVTICh0 KSkpCiAgICByZXR1cm4gMDsKCiAgLyogVGhlIEMgc3RhbmRhcmQgc3BlY2lm aWNhbGx5IGFsbG93cyBhbGlhc2luZyBiZXR3ZWVuIHNpZ25lZCBhbmQKICAg ICB1bnNpZ25lZCB2YXJpYW50cyBvZiB0aGUgc2FtZSB0eXBlLiAgV2UgdHJl YXQgdGhlIHNpZ25lZAogICAgIHZhcmlhbnQgYXMgY2Fub25pY2FsLiAgKi8K ICBpZiAoVFJFRV9DT0RFICh0KSA9PSBJTlRFR0VSX1RZUEUgJiYgVFlQRV9V TlNJR05FRCAodCkpCiAgICB7CiAgICAgIHRyZWUgdDEgPSBjX2NvbW1vbl9z aWduZWRfdHlwZSAodCk7CgogICAgICAvKiB0MSA9PSB0IGNhbiBoYXBwZW4g Zm9yIGJvb2xlYW4gbm9kZXMgd2hpY2ggYXJlIGFsd2F5cyB1bnNpZ25lZC4g ICovCiAgICAgIGlmICh0MSAhPSB0KQoJcmV0dXJuIGdldF9hbGlhc19zZXQg KHQxKTsKICAgIH0KICBlbHNlIGlmIChQT0lOVEVSX1RZUEVfUCAodCkpCiAg ICB7CiAgICAgIHRyZWUgdDE7CgogICAgICAvKiBVbmZvcnR1bmF0ZWx5LCB0 aGVyZSBpcyBubyBjYW5vbmljYWwgZm9ybSBvZiBhIHBvaW50ZXIgdHlwZS4K CSBJbiBwYXJ0aWN1bGFyLCBpZiB3ZSBoYXZlIGB0eXBlZGVmIGludCBJJywg dGhlbiBgaW50IConLCBhbmQKCSBgSSAqJyBhcmUgZGlmZmVyZW50IHR5cGVz LiAgU28sIHdlIGhhdmUgdG8gcGljayBhIGNhbm9uaWNhbAoJIHJlcHJlc2Vu dGF0aXZlLiAgV2UgZG8gdGhpcyBiZWxvdy4KCgkgVGVjaG5pY2FsbHksIHRo aXMgYXBwcm9hY2ggaXMgYWN0dWFsbHkgbW9yZSBjb25zZXJ2YXRpdmUgdGhh dAoJIGl0IG5lZWRzIHRvIGJlLiAgSW4gcGFydGljdWxhciwgYGNvbnN0IGlu dCAqJyBhbmQgYGludCAqJwoJIHNob3VsZCBiZSBpbiBkaWZmZXJlbnQgYWxp YXMgc2V0cywgYWNjb3JkaW5nIHRvIHRoZSBDIGFuZCBDKysKCSBzdGFuZGFy ZCwgc2luY2UgdGhlaXIgdHlwZXMgYXJlIG5vdCB0aGUgc2FtZSwgYW5kIHNv LAoJIHRlY2huaWNhbGx5LCBhbiBgaW50ICoqJyBhbmQgYGNvbnN0IGludCAq KicgY2Fubm90IHBvaW50IGF0CgkgdGhlIHNhbWUgdGhpbmcuCgoJIEJ1dCwg dGhlIHN0YW5kYXJkIGlzIHdyb25nLiAgSW4gcGFydGljdWxhciwgdGhpcyBj b2RlIGlzCgkgbGVnYWwgQysrOgoKCSAgICBpbnQgKmlwOwoJICAgIGludCAq KmlwcCA9ICZpcDsKCSAgICBjb25zdCBpbnQqIGNvbnN0KiBjaXBwID0gaXBw OwoKCSBBbmQsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgdGhhdCB0byBi ZSBsZWdhbCB1bmxlc3MgeW91CgkgY2FuIGRlcmVmZXJlbmNlIElQUCBhbmQg Q0lQUC4gIFNvLCB3ZSBpZ25vcmUgY3YtcXVhbGlmaWVycyBvbgoJIHRoZSBw b2ludGVkLXRvIHR5cGVzLiAgVGhpcyBpc3N1ZSBoYXMgYmVlbiByZXBvcnRl ZCB0byB0aGUKCSBDKysgY29tbWl0dGVlLiAgKi8KICAgICAgdDEgPSBidWls ZF90eXBlX25vX3F1YWxzICh0KTsKICAgICAgaWYgKHQxICE9IHQpCglyZXR1 cm4gZ2V0X2FsaWFzX3NldCAodDEpOwogICAgfQoKICAvKiBIYW5kbGUgdGhl IGNhc2Ugb2YgbXVsdGlwbGUgdHlwZSBub2RlcyByZWZlcnJpbmcgdG8gInRo ZSBzYW1lIiB0eXBlLAogICAgIHdoaWNoIG9jY3VycyB3aXRoIElNQS4gIFRo ZXNlIHNoYXJlIGFuIGFsaWFzIHNldC4gIEZJWE1FOiAgQ3VycmVudGx5IG9u bHkKICAgICBDOTAgaXMgaGFuZGxlZC4gIChJbiBDOTkgdHlwZSBjb21wYXRp YmlsaXR5IGlzIG5vdCB0cmFuc2l0aXZlLCB3aGljaAogICAgIGNvbXBsaWNh dGVzIHRoaW5ncyBtaWdodGlseS4gVGhlIGFsaWFzIHNldCBzcGxheSB0cmVl cyBjYW4gdGhlb3JldGljYWxseQogICAgIHJlcHJlc2VudCB0aGlzLCBidXQg aW5zZXJ0aW9uIGlzIHRyaWNreSB3aGVuIHlvdSBjb25zaWRlciBhbGwgdGhl CiAgICAgZGlmZmVyZW50IG9yZGVycyB0aGluZ3MgbWlnaHQgYXJyaXZlIGlu LikgKi8KCiAgaWYgKGNfbGFuZ3VhZ2UgIT0gY2xrX2MgfHwgZmxhZ19pc29j OTkpCiAgICByZXR1cm4gLTE7CgogIC8qIFNhdmUgdGltZSBpZiB0aGVyZSdz IG9ubHkgb25lIGlucHV0IGZpbGUuICAqLwogIGlmIChudW1faW5fZm5hbWVz ID09IDEpCiAgICByZXR1cm4gLTE7CgogIC8qIFBvaW50ZXJzIG5lZWQgc3Bl Y2lhbCBoYW5kbGluZyBpZiB0aGV5IHBvaW50IHRvIGFueSB0eXBlIHRoYXQK ICAgICBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nIChiZWxvdykuICAqLwogIGlm IChUUkVFX0NPREUgKHQpID09IFBPSU5URVJfVFlQRSkKICAgIHsKICAgICAg dHJlZSB0MjsKICAgICAgLyogRmluZCBib3R0b20gdHlwZSB1bmRlciBhbnkg bmVzdGVkIFBPSU5URVJzLiAgKi8KICAgICAgZm9yICh0MiA9IFRSRUVfVFlQ RSAodCk7CgkgICBUUkVFX0NPREUgKHQyKSA9PSBQT0lOVEVSX1RZUEU7Cgkg ICB0MiA9IFRSRUVfVFlQRSAodDIpKQoJOwogICAgICBpZiAoVFJFRV9DT0RF ICh0MikgIT0gUkVDT1JEX1RZUEUKCSAgJiYgVFJFRV9DT0RFICh0MikgIT0g RU5VTUVSQUxfVFlQRQoJICAmJiBUUkVFX0NPREUgKHQyKSAhPSBRVUFMX1VO SU9OX1RZUEUKCSAgJiYgVFJFRV9DT0RFICh0MikgIT0gVU5JT05fVFlQRSkK CXJldHVybiAtMTsKICAgICAgaWYgKFRZUEVfU0laRSAodDIpID09IDApCgly ZXR1cm4gLTE7CiAgICB9CiAgLyogVGhlc2UgYXJlIHRoZSBvbmx5IGNhc2Vz IHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KICBpZiAoVFJFRV9D T0RFICh0KSAhPSBSRUNPUkRfVFlQRQogICAgICAmJiBUUkVFX0NPREUgKHQp ICE9IEVOVU1FUkFMX1RZUEUKICAgICAgJiYgVFJFRV9DT0RFICh0KSAhPSBR VUFMX1VOSU9OX1RZUEUKICAgICAgJiYgVFJFRV9DT0RFICh0KSAhPSBVTklP Tl9UWVBFCiAgICAgICYmIFRSRUVfQ09ERSAodCkgIT0gUE9JTlRFUl9UWVBF KQogICAgcmV0dXJuIC0xOwogIC8qIFVuZGVmaW5lZD8gKi8KICBpZiAoVFlQ RV9TSVpFICh0KSA9PSAwKQogICAgcmV0dXJuIC0xOwoKICAvKiBMb29rIHVw IHQgaW4gaGFzaCB0YWJsZS4gIE9ubHkgb25lIG9mIHRoZSBjb21wYXRpYmxl IHR5cGVzIHdpdGhpbiBlYWNoCiAgICAgYWxpYXMgc2V0IGlzIHJlY29yZGVk IGluIHRoZSB0YWJsZS4gICovCiAgaWYgKCF0eXBlX2hhc2hfdGFibGUpCiAg ICB0eXBlX2hhc2hfdGFibGUgPSBodGFiX2NyZWF0ZV9nZ2MgKDEwMjEsIGNf dHlwZV9oYXNoLAoJICAgIChodGFiX2VxKSBsYW5nX2hvb2tzLnR5cGVzX2Nv bXBhdGlibGVfcCwKCSAgICBOVUxMKTsKICBzbG90ID0gaHRhYl9maW5kX3Ns b3QgKHR5cGVfaGFzaF90YWJsZSwgdCwgSU5TRVJUKTsKICBpZiAoKnNsb3Qg IT0gTlVMTCkKICAgIHsKICAgICAgVFlQRV9BTElBU19TRVQgKHQpID0gVFlQ RV9BTElBU19TRVQgKCh0cmVlKSpzbG90KTsKICAgICAgcmV0dXJuIFRZUEVf QUxJQVNfU0VUICgodHJlZSkqc2xvdCk7CiAgICB9CiAgZWxzZQogICAgLyog T3VyIGNhbGxlciB3aWxsIGFzc2lnbiBhbmQgcmVjb3JkIChpbiB0KSBhIG5l dyBhbGlhcyBzZXQ7IGFsbCB3ZSBuZWVkCiAgICAgICB0byBkbyBpcyByZW1l bWJlciB0IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KICAgICpzbG90ID0gdDsK CiAgcmV0dXJuIC0xOwp9CgwKLyogQ29tcHV0ZSB0aGUgdmFsdWUgb2YgJ3Np emVvZiAoVFlQRSknIG9yICdfX2FsaWdub2ZfXyAoVFlQRSknLCB3aGVyZSB0 aGUKICAgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hpY2ggT1BFUkFU T1IgaXMgYmVpbmcgYXBwbGllZC4gIFRoZSBDT01QTEFJTgogICBmbGFnIGNv bnRyb2xzIHdoZXRoZXIgd2Ugc2hvdWxkIGRpYWdub3NlIHBvc3NpYmx5IGls bC1mb3JtZWQKICAgY29uc3RydWN0cyBvciBub3QuICAqLwoKdHJlZQpjX3Np emVvZl9vcl9hbGlnbm9mX3R5cGUgKHRyZWUgdHlwZSwgYm9vbCBpc19zaXpl b2YsIGludCBjb21wbGFpbikKewogIGNvbnN0IGNoYXIgKm9wX25hbWU7CiAg dHJlZSB2YWx1ZSA9IE5VTEw7CiAgZW51bSB0cmVlX2NvZGUgdHlwZV9jb2Rl ID0gVFJFRV9DT0RFICh0eXBlKTsKCiAgb3BfbmFtZSA9IGlzX3NpemVvZiA/ ICJzaXplb2YiIDogIl9fYWxpZ25vZl9fIjsKCiAgaWYgKHR5cGVfY29kZSA9 PSBGVU5DVElPTl9UWVBFKQogICAgewogICAgICBpZiAoaXNfc2l6ZW9mKQoJ ewoJICBpZiAoY29tcGxhaW4gJiYgKHBlZGFudGljIHx8IHdhcm5fcG9pbnRl cl9hcml0aCkpCgkgICAgcGVkd2FybiAoImludmFsaWQgYXBwbGljYXRpb24g b2YgJTxzaXplb2YlPiB0byBhIGZ1bmN0aW9uIHR5cGUiKTsKCSAgdmFsdWUg PSBzaXplX29uZV9ub2RlOwoJfQogICAgICBlbHNlCgl2YWx1ZSA9IHNpemVf aW50IChGVU5DVElPTl9CT1VOREFSWSAvIEJJVFNfUEVSX1VOSVQpOwogICAg fQogIGVsc2UgaWYgKHR5cGVfY29kZSA9PSBWT0lEX1RZUEUgfHwgdHlwZV9j b2RlID09IEVSUk9SX01BUkspCiAgICB7CiAgICAgIGlmICh0eXBlX2NvZGUg PT0gVk9JRF9UWVBFCgkgICYmIGNvbXBsYWluICYmIChwZWRhbnRpYyB8fCB3 YXJuX3BvaW50ZXJfYXJpdGgpKQoJcGVkd2FybiAoImludmFsaWQgYXBwbGlj YXRpb24gb2YgJXFzIHRvIGEgdm9pZCB0eXBlIiwgb3BfbmFtZSk7CiAgICAg IHZhbHVlID0gc2l6ZV9vbmVfbm9kZTsKICAgIH0KICBlbHNlIGlmICghQ09N UExFVEVfVFlQRV9QICh0eXBlKSkKICAgIHsKICAgICAgaWYgKGNvbXBsYWlu KQoJZXJyb3IgKCJpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICVxcyB0byBpbmNv bXBsZXRlIHR5cGUgJXFUICIsCgkgICAgICAgb3BfbmFtZSwgdHlwZSk7CiAg ICAgIHZhbHVlID0gc2l6ZV96ZXJvX25vZGU7CiAgICB9CiAgZWxzZQogICAg ewogICAgICBpZiAoaXNfc2l6ZW9mKQoJLyogQ29udmVydCBpbiBjYXNlIGEg Y2hhciBpcyBtb3JlIHRoYW4gb25lIHVuaXQuICAqLwoJdmFsdWUgPSBzaXpl X2Jpbm9wIChDRUlMX0RJVl9FWFBSLCBUWVBFX1NJWkVfVU5JVCAodHlwZSks CgkJCSAgICBzaXplX2ludCAoVFlQRV9QUkVDSVNJT04gKGNoYXJfdHlwZV9u b2RlKQoJCQkJICAgICAgLyBCSVRTX1BFUl9VTklUKSk7CiAgICAgIGVsc2UK CXZhbHVlID0gc2l6ZV9pbnQgKFRZUEVfQUxJR05fVU5JVCAodHlwZSkpOwog ICAgfQoKICAvKiBWQUxVRSB3aWxsIGhhdmUgYW4gaW50ZWdlciB0eXBlIHdp dGggVFlQRV9JU19TSVpFVFlQRSBzZXQuCiAgICAgVFlQRV9JU19TSVpFVFlQ RSBtZWFucyB0aGF0IGNlcnRhaW4gdGhpbmdzIChsaWtlIG92ZXJmbG93KSB3 aWxsCiAgICAgbmV2ZXIgaGFwcGVuLiAgSG93ZXZlciwgdGhpcyBub2RlIHNo b3VsZCByZWFsbHkgaGF2ZSB0eXBlCiAgICAgYHNpemVfdCcsIHdoaWNoIGlz IGp1c3QgYSB0eXBlZGVmIGZvciBhbiBvcmRpbmFyeSBpbnRlZ2VyIHR5cGUu ICAqLwogIHZhbHVlID0gZm9sZF9jb252ZXJ0IChzaXplX3R5cGVfbm9kZSwg dmFsdWUpOwogIGdjY19hc3NlcnQgKCFUWVBFX0lTX1NJWkVUWVBFIChUUkVF X1RZUEUgKHZhbHVlKSkpOwoKICByZXR1cm4gdmFsdWU7Cn0KCi8qIEltcGxl bWVudCB0aGUgX19hbGlnbm9mIGtleXdvcmQ6IFJldHVybiB0aGUgbWluaW11 bSByZXF1aXJlZAogICBhbGlnbm1lbnQgb2YgRVhQUiwgbWVhc3VyZWQgaW4g Ynl0ZXMuICBGb3IgVkFSX0RFQ0xzLAogICBGVU5DVElPTl9ERUNMcyBhbmQg RklFTERfREVDTHMgcmV0dXJuIERFQ0xfQUxJR04gKHdoaWNoIGNhbiBiZSBz ZXQKICAgZnJvbSBhbiAiYWxpZ25lZCIgX19hdHRyaWJ1dGVfXyBzcGVjaWZp Y2F0aW9uKS4gICovCgp0cmVlCmNfYWxpZ25vZl9leHByICh0cmVlIGV4cHIp CnsKICB0cmVlIHQ7CgogIGlmIChWQVJfT1JfRlVOQ1RJT05fREVDTF9QIChl eHByKSkKICAgIHQgPSBzaXplX2ludCAoREVDTF9BTElHTl9VTklUIChleHBy KSk7CgogIGVsc2UgaWYgKFRSRUVfQ09ERSAoZXhwcikgPT0gQ09NUE9ORU5U X1JFRgoJICAgJiYgREVDTF9DX0JJVF9GSUVMRCAoVFJFRV9PUEVSQU5EIChl eHByLCAxKSkpCiAgICB7CiAgICAgIGVycm9yICgiJTxfX2FsaWdub2YlPiBh cHBsaWVkIHRvIGEgYml0LWZpZWxkIik7CiAgICAgIHQgPSBzaXplX29uZV9u b2RlOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09ERSAoZXhwcikgPT0gQ09N UE9ORU5UX1JFRgoJICAgJiYgVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKGV4 cHIsIDEpKSA9PSBGSUVMRF9ERUNMKQogICAgdCA9IHNpemVfaW50IChERUNM X0FMSUdOX1VOSVQgKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpKTsKCiAgZWxz ZSBpZiAoVFJFRV9DT0RFIChleHByKSA9PSBJTkRJUkVDVF9SRUYpCiAgICB7 CiAgICAgIHRyZWUgdCA9IFRSRUVfT1BFUkFORCAoZXhwciwgMCk7CiAgICAg IHRyZWUgYmVzdCA9IHQ7CiAgICAgIGludCBiZXN0YWxpZ24gPSBUWVBFX0FM SUdOIChUUkVFX1RZUEUgKFRSRUVfVFlQRSAodCkpKTsKCiAgICAgIHdoaWxl ICgoVFJFRV9DT0RFICh0KSA9PSBOT1BfRVhQUiB8fCBUUkVFX0NPREUgKHQp ID09IENPTlZFUlRfRVhQUikKCSAgICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZ UEUgKFRSRUVfT1BFUkFORCAodCwgMCkpKSA9PSBQT0lOVEVSX1RZUEUpCgl7 CgkgIGludCB0aGlzYWxpZ247CgoJICB0ID0gVFJFRV9PUEVSQU5EICh0LCAw KTsKCSAgdGhpc2FsaWduID0gVFlQRV9BTElHTiAoVFJFRV9UWVBFIChUUkVF X1RZUEUgKHQpKSk7CgkgIGlmICh0aGlzYWxpZ24gPiBiZXN0YWxpZ24pCgkg ICAgYmVzdCA9IHQsIGJlc3RhbGlnbiA9IHRoaXNhbGlnbjsKCX0KICAgICAg cmV0dXJuIGNfYWxpZ25vZiAoVFJFRV9UWVBFIChUUkVFX1RZUEUgKGJlc3Qp KSk7CiAgICB9CiAgZWxzZQogICAgcmV0dXJuIGNfYWxpZ25vZiAoVFJFRV9U WVBFIChleHByKSk7CgogIHJldHVybiBmb2xkX2NvbnZlcnQgKHNpemVfdHlw ZV9ub2RlLCB0KTsKfQoMCi8qIEhhbmRsZSBDIGFuZCBDKysgZGVmYXVsdCBh dHRyaWJ1dGVzLiAgKi8KCmVudW0gYnVpbHRfaW5fYXR0cmlidXRlCnsKI2Rl ZmluZSBERUZfQVRUUl9OVUxMX1RSRUUoRU5VTSkgRU5VTSwKI2RlZmluZSBE RUZfQVRUUl9JTlQoRU5VTSwgVkFMVUUpIEVOVU0sCiNkZWZpbmUgREVGX0FU VFJfSURFTlQoRU5VTSwgU1RSSU5HKSBFTlVNLAojZGVmaW5lIERFRl9BVFRS X1RSRUVfTElTVChFTlVNLCBQVVJQT1NFLCBWQUxVRSwgQ0hBSU4pIEVOVU0s CiNpbmNsdWRlICJidWlsdGluLWF0dHJzLmRlZiIKI3VuZGVmIERFRl9BVFRS X05VTExfVFJFRQojdW5kZWYgREVGX0FUVFJfSU5UCiN1bmRlZiBERUZfQVRU Ul9JREVOVAojdW5kZWYgREVGX0FUVFJfVFJFRV9MSVNUCiAgQVRUUl9MQVNU Cn07CgpzdGF0aWMgR1RZKCgpKSB0cmVlIGJ1aWx0X2luX2F0dHJpYnV0ZXNb KGludCkgQVRUUl9MQVNUXTsKCnN0YXRpYyB2b2lkIGNfaW5pdF9hdHRyaWJ1 dGVzICh2b2lkKTsKCmVudW0gY19idWlsdGluX3R5cGUKewojZGVmaW5lIERF Rl9QUklNSVRJVkVfVFlQRShOQU1FLCBWQUxVRSkgTkFNRSwKI2RlZmluZSBE RUZfRlVOQ1RJT05fVFlQRV8wKE5BTUUsIFJFVFVSTikgTkFNRSwKI2RlZmlu ZSBERUZfRlVOQ1RJT05fVFlQRV8xKE5BTUUsIFJFVFVSTiwgQVJHMSkgTkFN RSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV8yKE5BTUUsIFJFVFVSTiwg QVJHMSwgQVJHMikgTkFNRSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV8z KE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMykgTkFNRSwKI2RlZmlu ZSBERUZfRlVOQ1RJT05fVFlQRV80KE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJH MiwgQVJHMywgQVJHNCkgTkFNRSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQ RV81KE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJH NSkgTkFNRSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV82KE5BTUUsIFJF VFVSTiwgQVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNSwgQVJHNikgTkFN RSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV83KE5BTUUsIFJFVFVSTiwg QVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNSwgQVJHNiwgQVJHNykgTkFN RSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV9WQVJfMChOQU1FLCBSRVRV Uk4pIE5BTUUsCiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfVkFSXzEoTkFN RSwgUkVUVVJOLCBBUkcxKSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9U WVBFX1ZBUl8yKE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJHMikgTkFNRSwKI2Rl ZmluZSBERUZfRlVOQ1RJT05fVFlQRV9WQVJfMyhOQU1FLCBSRVRVUk4sIEFS RzEsIEFSRzIsIEFSRzMpIE5BTUUsCiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZ UEVfVkFSXzQoTkFNRSwgUkVUVVJOLCBBUkcxLCBBUkcyLCBBUkczLCBBUkc0 KSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFX1ZBUl81KE5BTUUs IFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNikgXAogIE5B TUUsCiNkZWZpbmUgREVGX1BPSU5URVJfVFlQRShOQU1FLCBUWVBFKSBOQU1F LAojaW5jbHVkZSAiYnVpbHRpbi10eXBlcy5kZWYiCiN1bmRlZiBERUZfUFJJ TUlUSVZFX1RZUEUKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzAKI3VuZGVm IERFRl9GVU5DVElPTl9UWVBFXzEKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBF XzIKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzMKI3VuZGVmIERFRl9GVU5D VElPTl9UWVBFXzQKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzUKI3VuZGVm IERFRl9GVU5DVElPTl9UWVBFXzYKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBF XzcKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8wCiN1bmRlZiBERUZf RlVOQ1RJT05fVFlQRV9WQVJfMQojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVf VkFSXzIKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8zCiN1bmRlZiBE RUZfRlVOQ1RJT05fVFlQRV9WQVJfNAojdW5kZWYgREVGX0ZVTkNUSU9OX1RZ UEVfVkFSXzUKI3VuZGVmIERFRl9QT0lOVEVSX1RZUEUKICBCVF9MQVNUCn07 Cgp0eXBlZGVmIGVudW0gY19idWlsdGluX3R5cGUgYnVpbHRpbl90eXBlOwoK LyogQSB0ZW1wb3JhcnkgYXJyYXkgZm9yIGNfY29tbW9uX25vZGVzX2FuZF9i dWlsdGlucy4gIFVzZWQgaW4KICAgY29tbXVuaWNhdGlvbiB3aXRoIGRlZl9m bl90eXBlLiAgKi8Kc3RhdGljIHRyZWUgYnVpbHRpbl90eXBlc1soaW50KSBC VF9MQVNUICsgMV07CgovKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgY19jb21t b25fbm9kZXNfYW5kX2J1aWx0aW5zLiAgQnVpbGQgZnVuY3Rpb24gdHlwZQog ICBmb3IgREVGIHdpdGggcmV0dXJuIHR5cGUgUkVUIGFuZCBOIGFyZ3VtZW50 cy4gIElmIFZBUiBpcyB0cnVlLCB0aGVuIHRoZQogICBmdW5jdGlvbiBzaG91 bGQgYmUgdmFyaWFkaWMgYWZ0ZXIgdGhvc2UgTiBhcmd1bWVudHMuCgogICBU YWtlcyBzcGVjaWFsIGNhcmUgbm90IHRvIElDRSBpZiBhbnkgb2YgdGhlIHR5 cGVzIGludm9sdmVkIGFyZQogICBlcnJvcl9tYXJrX25vZGUsIHdoaWNoIGlu ZGljYXRlcyB0aGF0IHNhaWQgdHlwZSBpcyBub3QgaW4gZmFjdCBhdmFpbGFi bGUKICAgKHNlZSBidWlsdGluX3R5cGVfZm9yX3NpemUpLiAgSW4gd2hpY2gg Y2FzZSB0aGUgZnVuY3Rpb24gdHlwZSBhcyBhIHdob2xlCiAgIHNob3VsZCBi ZSBlcnJvcl9tYXJrX25vZGUuICAqLwoKc3RhdGljIHZvaWQKZGVmX2ZuX3R5 cGUgKGJ1aWx0aW5fdHlwZSBkZWYsIGJ1aWx0aW5fdHlwZSByZXQsIGJvb2wg dmFyLCBpbnQgbiwgLi4uKQp7CiAgdHJlZSBhcmdzID0gTlVMTCwgdDsKICB2 YV9saXN0IGxpc3Q7CiAgaW50IGk7CgogIHZhX3N0YXJ0IChsaXN0LCBuKTsK ICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQogICAgewogICAgICBidWlsdGlu X3R5cGUgYSA9IHZhX2FyZyAobGlzdCwgYnVpbHRpbl90eXBlKTsKICAgICAg dCA9IGJ1aWx0aW5fdHlwZXNbYV07CiAgICAgIGlmICh0ID09IGVycm9yX21h cmtfbm9kZSkKCWdvdG8gZWdyZXNzOwogICAgICBhcmdzID0gdHJlZV9jb25z IChOVUxMX1RSRUUsIHQsIGFyZ3MpOwogICAgfQogIHZhX2VuZCAobGlzdCk7 CgogIGFyZ3MgPSBucmV2ZXJzZSAoYXJncyk7CiAgaWYgKCF2YXIpCiAgICBh cmdzID0gY2hhaW5vbiAoYXJncywgdm9pZF9saXN0X25vZGUpOwoKICB0ID0g YnVpbHRpbl90eXBlc1tyZXRdOwogIGlmICh0ID09IGVycm9yX21hcmtfbm9k ZSkKICAgIGdvdG8gZWdyZXNzOwogIHQgPSBidWlsZF9mdW5jdGlvbl90eXBl ICh0LCBhcmdzKTsKCiBlZ3Jlc3M6CiAgYnVpbHRpbl90eXBlc1tkZWZdID0g dDsKfQoKLyogQnVpbGQgYnVpbHRpbiBmdW5jdGlvbnMgY29tbW9uIHRvIGJv dGggQyBhbmQgQysrIGxhbmd1YWdlCiAgIGZyb250ZW5kcy4gICovCgpzdGF0 aWMgdm9pZApjX2RlZmluZV9idWlsdGlucyAodHJlZSB2YV9saXN0X3JlZl90 eXBlX25vZGUsIHRyZWUgdmFfbGlzdF9hcmdfdHlwZV9ub2RlKQp7CiNkZWZp bmUgREVGX1BSSU1JVElWRV9UWVBFKEVOVU0sIFZBTFVFKSBcCiAgYnVpbHRp bl90eXBlc1tFTlVNXSA9IFZBTFVFOwojZGVmaW5lIERFRl9GVU5DVElPTl9U WVBFXzAoRU5VTSwgUkVUVVJOKSBcCiAgZGVmX2ZuX3R5cGUgKEVOVU0sIFJF VFVSTiwgMCwgMCk7CiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfMShFTlVN LCBSRVRVUk4sIEFSRzEpIFwKICBkZWZfZm5fdHlwZSAoRU5VTSwgUkVUVVJO LCAwLCAxLCBBUkcxKTsKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV8yKEVO VU0sIFJFVFVSTiwgQVJHMSwgQVJHMikgXAogIGRlZl9mbl90eXBlIChFTlVN LCBSRVRVUk4sIDAsIDIsIEFSRzEsIEFSRzIpOwojZGVmaW5lIERFRl9GVU5D VElPTl9UWVBFXzMoRU5VTSwgUkVUVVJOLCBBUkcxLCBBUkcyLCBBUkczKSBc CiAgZGVmX2ZuX3R5cGUgKEVOVU0sIFJFVFVSTiwgMCwgMywgQVJHMSwgQVJH MiwgQVJHMyk7CiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfNChFTlVNLCBS RVRVUk4sIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQpIFwKICBkZWZfZm5fdHlw ZSAoRU5VTSwgUkVUVVJOLCAwLCA0LCBBUkcxLCBBUkcyLCBBUkczLCBBUkc0 KTsKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV81KEVOVU0sIFJFVFVSTiwg QVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNSkJXAogIGRlZl9mbl90eXBl IChFTlVNLCBSRVRVUk4sIDAsIDUsIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQs IEFSRzUpOwojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFXzYoRU5VTSwgUkVU VVJOLCBBUkcxLCBBUkcyLCBBUkczLCBBUkc0LCBBUkc1LCBcCgkJCSAgICBB Ukc2KQkJCQkJXAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRVUk4sIDAsIDYs IEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQsIEFSRzUsIEFSRzYpOwojZGVmaW5l IERFRl9GVU5DVElPTl9UWVBFXzcoRU5VTSwgUkVUVVJOLCBBUkcxLCBBUkcy LCBBUkczLCBBUkc0LCBBUkc1LCBcCgkJCSAgICBBUkc2LCBBUkc3KQkJCQkJ XAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRVUk4sIDAsIDcsIEFSRzEsIEFS RzIsIEFSRzMsIEFSRzQsIEFSRzUsIEFSRzYsIEFSRzcpOwojZGVmaW5lIERF Rl9GVU5DVElPTl9UWVBFX1ZBUl8wKEVOVU0sIFJFVFVSTikgXAogIGRlZl9m bl90eXBlIChFTlVNLCBSRVRVUk4sIDEsIDApOwojZGVmaW5lIERFRl9GVU5D VElPTl9UWVBFX1ZBUl8xKEVOVU0sIFJFVFVSTiwgQVJHMSkgXAogIGRlZl9m bl90eXBlIChFTlVNLCBSRVRVUk4sIDEsIDEsIEFSRzEpOwojZGVmaW5lIERF Rl9GVU5DVElPTl9UWVBFX1ZBUl8yKEVOVU0sIFJFVFVSTiwgQVJHMSwgQVJH MikgXAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRVUk4sIDEsIDIsIEFSRzEs IEFSRzIpOwojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8zKEVOVU0s IFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMykgXAogIGRlZl9mbl90eXBlIChF TlVNLCBSRVRVUk4sIDEsIDMsIEFSRzEsIEFSRzIsIEFSRzMpOwojZGVmaW5l IERFRl9GVU5DVElPTl9UWVBFX1ZBUl80KEVOVU0sIFJFVFVSTiwgQVJHMSwg QVJHMiwgQVJHMywgQVJHNCkgXAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRV Uk4sIDEsIDQsIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQpOwojZGVmaW5lIERF Rl9GVU5DVElPTl9UWVBFX1ZBUl81KEVOVU0sIFJFVFVSTiwgQVJHMSwgQVJH MiwgQVJHMywgQVJHNCwgQVJHNSkgXAogIGRlZl9mbl90eXBlIChFTlVNLCBS RVRVUk4sIDEsIDUsIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQsIEFSRzUpOwoj ZGVmaW5lIERFRl9QT0lOVEVSX1RZUEUoRU5VTSwgVFlQRSkgXAogIGJ1aWx0 aW5fdHlwZXNbKGludCkgRU5VTV0gPSBidWlsZF9wb2ludGVyX3R5cGUgKGJ1 aWx0aW5fdHlwZXNbKGludCkgVFlQRV0pOwoKI2luY2x1ZGUgImJ1aWx0aW4t dHlwZXMuZGVmIgoKI3VuZGVmIERFRl9QUklNSVRJVkVfVFlQRQojdW5kZWYg REVGX0ZVTkNUSU9OX1RZUEVfMQojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVf MgojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfMwojdW5kZWYgREVGX0ZVTkNU SU9OX1RZUEVfNAojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfNQojdW5kZWYg REVGX0ZVTkNUSU9OX1RZUEVfNgojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVf VkFSXzAKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8xCiN1bmRlZiBE RUZfRlVOQ1RJT05fVFlQRV9WQVJfMgojdW5kZWYgREVGX0ZVTkNUSU9OX1RZ UEVfVkFSXzMKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl80CiN1bmRl ZiBERUZfRlVOQ1RJT05fVFlQRV9WQVJfNQojdW5kZWYgREVGX1BPSU5URVJf VFlQRQogIGJ1aWx0aW5fdHlwZXNbKGludCkgQlRfTEFTVF0gPSBOVUxMX1RS RUU7CgogIGNfaW5pdF9hdHRyaWJ1dGVzICgpOwoKI2RlZmluZSBERUZfQlVJ TFRJTihFTlVNLCBOQU1FLCBDTEFTUywgVFlQRSwgTElCVFlQRSwgQk9USF9Q LCBGQUxMQkFDS19QLCBcCgkJICAgIE5PTkFOU0lfUCwgQVRUUlMsIElNUExJ Q0lULCBDT05EKQkJCVwKICBpZiAoTkFNRSAmJiBDT05EKQkJCQkJCQlcCiAg ICBkZWZfYnVpbHRpbl8xIChFTlVNLCBOQU1FLCBDTEFTUywgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKCQkgICBidWlsdGluX3R5cGVz WyhpbnQpIFRZUEVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKCQkg ICBidWlsdGluX3R5cGVzWyhpbnQpIExJQlRZUEVdLCAgICAgICAgICAgICAg ICAgICAgICAgIFwKCQkgICBCT1RIX1AsIEZBTExCQUNLX1AsIE5PTkFOU0lf UCwgICAgICAgICAgICAgICAgICAgICAgIFwKCQkgICBidWlsdF9pbl9hdHRy aWJ1dGVzWyhpbnQpIEFUVFJTXSwgSU1QTElDSVQpOwojaW5jbHVkZSAiYnVp bHRpbnMuZGVmIgojdW5kZWYgREVGX0JVSUxUSU4KCiAgdGFyZ2V0bS5pbml0 X2J1aWx0aW5zICgpOwoKICBidWlsZF9jb21tb25fYnVpbHRpbl9ub2RlcyAo KTsKCiAgaWYgKGZsYWdfbXVkZmxhcCkKICAgIG11ZGZsYXBfaW5pdCAoKTsK fQoKLyogQnVpbGQgdHJlZSBub2RlcyBhbmQgYnVpbHRpbiBmdW5jdGlvbnMg Y29tbW9uIHRvIGJvdGggQyBhbmQgQysrIGxhbmd1YWdlCiAgIGZyb250ZW5k cy4gICovCgp2b2lkCmNfY29tbW9uX25vZGVzX2FuZF9idWlsdGlucyAodm9p ZCkKewogIGludCB3Y2hhcl90eXBlX3NpemU7CiAgdHJlZSBhcnJheV9kb21h aW5fdHlwZTsKICB0cmVlIHZhX2xpc3RfcmVmX3R5cGVfbm9kZTsKICB0cmVl IHZhX2xpc3RfYXJnX3R5cGVfbm9kZTsKCiAgLyogRGVmaW5lIGBpbnQnIGFu ZCBgY2hhcicgZmlyc3Qgc28gdGhhdCBkYnggd2lsbCBvdXRwdXQgdGhlbSBm aXJzdC4gICovCiAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX0lOVCwgTlVM TCwgaW50ZWdlcl90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUg KFJJRF9DSEFSLCAiY2hhciIsIGNoYXJfdHlwZV9ub2RlKTsKCiAgLyogYHNp Z25lZCcgaXMgdGhlIHNhbWUgYXMgYGludCcuICBGSVhNRTogdGhlIGRlY2xh cmF0aW9ucyBvZiAic2lnbmVkIiwKICAgICAidW5zaWduZWQgbG9uZyIsICJs b25nIGxvbmcgdW5zaWduZWQiIGFuZCAidW5zaWduZWQgc2hvcnQiIHdlcmUg aW4gQysrCiAgICAgYnV0IG5vdCBDLiAgQXJlIHRoZSBjb25kaXRpb25hbHMg aGVyZSBuZWVkZWQ/ICAqLwogIGlmIChjX2RpYWxlY3RfY3h4ICgpKQogICAg cmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX1NJR05FRCwgTlVMTCwgaW50ZWdl cl90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9MT05H LCAibG9uZyBpbnQiLCBsb25nX2ludGVnZXJfdHlwZV9ub2RlKTsKICByZWNv cmRfYnVpbHRpbl90eXBlIChSSURfVU5TSUdORUQsICJ1bnNpZ25lZCBpbnQi LCB1bnNpZ25lZF90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUg KFJJRF9NQVgsICJsb25nIHVuc2lnbmVkIGludCIsCgkJICAgICAgIGxvbmdf dW5zaWduZWRfdHlwZV9ub2RlKTsKICBpZiAoY19kaWFsZWN0X2N4eCAoKSkK ICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJ1bnNpZ25lZCBs b25nIiwgbG9uZ191bnNpZ25lZF90eXBlX25vZGUpOwogIHJlY29yZF9idWls dGluX3R5cGUgKFJJRF9NQVgsICJsb25nIGxvbmcgaW50IiwKCQkgICAgICAg bG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIsCgkJ ICAgICAgIGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUpOwogIGlmIChj X2RpYWxlY3RfY3h4ICgpKQogICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklE X01BWCwgImxvbmcgbG9uZyB1bnNpZ25lZCIsCgkJCSBsb25nX2xvbmdfdW5z aWduZWRfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURf U0hPUlQsICJzaG9ydCBpbnQiLCBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZSk7 CiAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgInNob3J0IHVuc2ln bmVkIGludCIsCgkJICAgICAgIHNob3J0X3Vuc2lnbmVkX3R5cGVfbm9kZSk7 CiAgaWYgKGNfZGlhbGVjdF9jeHggKCkpCiAgICByZWNvcmRfYnVpbHRpbl90 eXBlIChSSURfTUFYLCAidW5zaWduZWQgc2hvcnQiLAoJCQkgc2hvcnRfdW5z aWduZWRfdHlwZV9ub2RlKTsKCiAgLyogRGVmaW5lIGJvdGggYHNpZ25lZCBj aGFyJyBhbmQgYHVuc2lnbmVkIGNoYXInLiAgKi8KICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAic2lnbmVkIGNoYXIiLCBzaWduZWRfY2hhcl90 eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJ1 bnNpZ25lZCBjaGFyIiwgdW5zaWduZWRfY2hhcl90eXBlX25vZGUpOwoKICAv KiBUaGVzZSBhcmUgdHlwZXMgdGhhdCBjX2NvbW1vbl90eXBlX2Zvcl9zaXpl IGFuZAogICAgIGNfY29tbW9uX3R5cGVfZm9yX21vZGUgdXNlLiAgKi8KICBs YW5nX2hvb2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RF Q0wsIE5VTExfVFJFRSwKCQkJCQkgaW50UUlfdHlwZV9ub2RlKSk7CiAgbGFu Z19ob29rcy5kZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAoVFlQRV9ERUNM LCBOVUxMX1RSRUUsCgkJCQkJIGludEhJX3R5cGVfbm9kZSkpOwogIGxhbmdf aG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwg TlVMTF9UUkVFLAoJCQkJCSBpbnRTSV90eXBlX25vZGUpKTsKICBsYW5nX2hv b2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIE5V TExfVFJFRSwKCQkJCQkgaW50RElfdHlwZV9ub2RlKSk7CiNpZiBIT1NUX0JJ VFNfUEVSX1dJREVfSU5UID49IDY0CiAgaWYgKHRhcmdldG0uc2NhbGFyX21v ZGVfc3VwcG9ydGVkX3AgKFRJbW9kZSkpCiAgICBsYW5nX2hvb2tzLmRlY2xz LnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsCgkJCQkJICAgZ2V0 X2lkZW50aWZpZXIgKCJfX2ludDEyOF90IiksCgkJCQkJICAgaW50VElfdHlw ZV9ub2RlKSk7CiNlbmRpZgogIGxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wg KGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwgTlVMTF9UUkVFLAoJCQkJCSB1bnNp Z25lZF9pbnRRSV90eXBlX25vZGUpKTsKICBsYW5nX2hvb2tzLmRlY2xzLnB1 c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIE5VTExfVFJFRSwKCQkJ CQkgdW5zaWduZWRfaW50SElfdHlwZV9ub2RlKSk7CiAgbGFuZ19ob29rcy5k ZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLCBOVUxMX1RS RUUsCgkJCQkJIHVuc2lnbmVkX2ludFNJX3R5cGVfbm9kZSkpOwogIGxhbmdf aG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwg TlVMTF9UUkVFLAoJCQkJCSB1bnNpZ25lZF9pbnRESV90eXBlX25vZGUpKTsK I2lmIEhPU1RfQklUU19QRVJfV0lERV9JTlQgPj0gNjQKICBpZiAodGFyZ2V0 bS5zY2FsYXJfbW9kZV9zdXBwb3J0ZWRfcCAoVEltb2RlKSkKICAgIGxhbmdf aG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwK CQkJCQkgICBnZXRfaWRlbnRpZmllciAoIl9fdWludDEyOF90IiksCgkJCQkJ ICAgdW5zaWduZWRfaW50VElfdHlwZV9ub2RlKSk7CiNlbmRpZgoKICAvKiBD cmVhdGUgdGhlIHdpZGVzdCBsaXRlcmFsIHR5cGVzLiAgKi8KICB3aWRlc3Rf aW50ZWdlcl9saXRlcmFsX3R5cGVfbm9kZQogICAgPSBtYWtlX3NpZ25lZF90 eXBlIChIT1NUX0JJVFNfUEVSX1dJREVfSU5UICogMik7CiAgbGFuZ19ob29r cy5kZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLCBOVUxM X1RSRUUsCgkJCQkJIHdpZGVzdF9pbnRlZ2VyX2xpdGVyYWxfdHlwZV9ub2Rl KSk7CgogIHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVfbm9kZQogICAg PSBtYWtlX3Vuc2lnbmVkX3R5cGUgKEhPU1RfQklUU19QRVJfV0lERV9JTlQg KiAyKTsKICBsYW5nX2hvb2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNs IChUWVBFX0RFQ0wsIE5VTExfVFJFRSwKCQkJCQkgd2lkZXN0X3Vuc2lnbmVk X2xpdGVyYWxfdHlwZV9ub2RlKSk7CgogIC8qIGB1bnNpZ25lZCBsb25nJyBp cyB0aGUgc3RhbmRhcmQgdHlwZSBmb3Igc2l6ZW9mLgogICAgIE5vdGUgdGhh dCBzdGRkZWYuaCB1c2VzIGB1bnNpZ25lZCBsb25nJywKICAgICBhbmQgdGhp cyBtdXN0IGFncmVlLCBldmVuIGlmIGxvbmcgYW5kIGludCBhcmUgdGhlIHNh bWUgc2l6ZS4gICovCiAgc2l6ZV90eXBlX25vZGUgPQogICAgVFJFRV9UWVBF IChpZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIgKFNJ WkVfVFlQRSkpKTsKICBzaWduZWRfc2l6ZV90eXBlX25vZGUgPSBjX2NvbW1v bl9zaWduZWRfdHlwZSAoc2l6ZV90eXBlX25vZGUpOwogIHNldF9zaXpldHlw ZSAoc2l6ZV90eXBlX25vZGUpOwoKICBwaWRfdHlwZV9ub2RlID0KICAgIFRS RUVfVFlQRSAoaWRlbnRpZmllcl9nbG9iYWxfdmFsdWUgKGdldF9pZGVudGlm aWVyIChQSURfVFlQRSkpKTsKCiAgYnVpbGRfY29tbW9uX3RyZWVfbm9kZXNf MiAoZmxhZ19zaG9ydF9kb3VibGUpOwoKICByZWNvcmRfYnVpbHRpbl90eXBl IChSSURfRkxPQVQsIE5VTEwsIGZsb2F0X3R5cGVfbm9kZSk7CiAgcmVjb3Jk X2J1aWx0aW5fdHlwZSAoUklEX0RPVUJMRSwgTlVMTCwgZG91YmxlX3R5cGVf bm9kZSk7CiAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgImxvbmcg ZG91YmxlIiwgbG9uZ19kb3VibGVfdHlwZV9ub2RlKTsKCiAgLyogT25seSBz dXBwb3J0ZWQgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBleHRlbnNpb24gaWYg dGhlIHRhcmdldAogICAgIGFjdHVhbGx5IHN1cHBvcnRzIHVuZGVybHlpbmcg bW9kZXMuICovCiAgaWYgKHRhcmdldG0uc2NhbGFyX21vZGVfc3VwcG9ydGVk X3AgKFNEbW9kZSkgCiAgICAgICYmIHRhcmdldG0uc2NhbGFyX21vZGVfc3Vw cG9ydGVkX3AgKEREbW9kZSkKICAgICAgJiYgdGFyZ2V0bS5zY2FsYXJfbW9k ZV9zdXBwb3J0ZWRfcCAoVERtb2RlKSkKICAgIHsKICAgICAgcmVjb3JkX2J1 aWx0aW5fdHlwZSAoUklEX0RGTE9BVDMyLCBOVUxMLCBkZmxvYXQzMl90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfREZMT0FU NjQsIE5VTEwsIGRmbG9hdDY0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9i dWlsdGluX3R5cGUgKFJJRF9ERkxPQVQxMjgsIE5VTEwsIGRmbG9hdDEyOF90 eXBlX25vZGUpOwogICAgfQoKICBpZiAodGFyZ2V0bS5maXhlZF9wb2ludF9z dXBwb3J0ZWRfcCAoKSkKICAgIHsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlw ZSAoUklEX01BWCwgInNob3J0IF9GcmFjdCIsIHNob3J0X2ZyYWN0X3R5cGVf bm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9GUkFDVCwg TlVMTCwgZnJhY3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSAoUklEX01BWCwgImxvbmcgX0ZyYWN0IiwgbG9uZ19mcmFjdF90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAi bG9uZyBsb25nIF9GcmFjdCIsCgkJCSAgIGxvbmdfbG9uZ19mcmFjdF90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAi dW5zaWduZWQgc2hvcnQgX0ZyYWN0IiwKCQkJICAgdW5zaWduZWRfc2hvcnRf ZnJhY3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAo UklEX01BWCwgInVuc2lnbmVkIF9GcmFjdCIsCgkJCSAgIHVuc2lnbmVkX2Zy YWN0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJ RF9NQVgsICJ1bnNpZ25lZCBsb25nIF9GcmFjdCIsCgkJCSAgIHVuc2lnbmVk X2xvbmdfZnJhY3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSAoUklEX01BWCwgInVuc2lnbmVkIGxvbmcgbG9uZyBfRnJhY3QiLAoJ CQkgICB1bnNpZ25lZF9sb25nX2xvbmdfZnJhY3RfdHlwZV9ub2RlKTsKICAg ICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgIl9TYXQgc2hvcnQg X0ZyYWN0IiwKCQkJICAgc2F0X3Nob3J0X2ZyYWN0X3R5cGVfbm9kZSk7CiAg ICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJfU2F0IF9GcmFj dCIsIHNhdF9mcmFjdF90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAiX1NhdCBsb25nIF9GcmFjdCIsCgkJCSAgIHNh dF9sb25nX2ZyYWN0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGlu X3R5cGUgKFJJRF9NQVgsICJfU2F0IGxvbmcgbG9uZyBfRnJhY3QiLAoJCQkg ICBzYXRfbG9uZ19sb25nX2ZyYWN0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29y ZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJfU2F0IHVuc2lnbmVkIHNob3J0 IF9GcmFjdCIsCgkJCSAgIHNhdF91bnNpZ25lZF9zaG9ydF9mcmFjdF90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAi X1NhdCB1bnNpZ25lZCBfRnJhY3QiLAoJCQkgICBzYXRfdW5zaWduZWRfZnJh Y3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklE X01BWCwgIl9TYXQgdW5zaWduZWQgbG9uZyBfRnJhY3QiLAoJCQkgICBzYXRf dW5zaWduZWRfbG9uZ19mcmFjdF90eXBlX25vZGUpOwogICAgICByZWNvcmRf YnVpbHRpbl90eXBlIChSSURfTUFYLCAiX1NhdCB1bnNpZ25lZCBsb25nIGxv bmcgX0ZyYWN0IiwKCQkJICAgc2F0X3Vuc2lnbmVkX2xvbmdfbG9uZ19mcmFj dF90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURf TUFYLCAic2hvcnQgX0FjY3VtIiwgc2hvcnRfYWNjdW1fdHlwZV9ub2RlKTsK ICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX0FDQ1VNLCBOVUxMLCBh Y2N1bV90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChS SURfTUFYLCAibG9uZyBfQWNjdW0iLCBsb25nX2FjY3VtX3R5cGVfbm9kZSk7 CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJsb25nIGxv bmcgX0FjY3VtIiwKCQkJICAgbG9uZ19sb25nX2FjY3VtX3R5cGVfbm9kZSk7 CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJ1bnNpZ25l ZCBzaG9ydCBfQWNjdW0iLAoJCQkgICB1bnNpZ25lZF9zaG9ydF9hY2N1bV90 eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFY LCAidW5zaWduZWQgX0FjY3VtIiwKCQkJICAgdW5zaWduZWRfYWNjdW1fdHlw ZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwg InVuc2lnbmVkIGxvbmcgX0FjY3VtIiwKCQkJICAgdW5zaWduZWRfbG9uZ19h Y2N1bV90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChS SURfTUFYLCAidW5zaWduZWQgbG9uZyBsb25nIF9BY2N1bSIsCgkJCSAgIHVu c2lnbmVkX2xvbmdfbG9uZ19hY2N1bV90eXBlX25vZGUpOwogICAgICByZWNv cmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAiX1NhdCBzaG9ydCBfQWNjdW0i LAoJCQkgICBzYXRfc2hvcnRfYWNjdW1fdHlwZV9ub2RlKTsKICAgICAgcmVj b3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgIl9TYXQgX0FjY3VtIiwgc2F0 X2FjY3VtX3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUg KFJJRF9NQVgsICJfU2F0IGxvbmcgX0FjY3VtIiwKCQkJICAgc2F0X2xvbmdf YWNjdW1fdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAo UklEX01BWCwgIl9TYXQgbG9uZyBsb25nIF9BY2N1bSIsCgkJCSAgc2F0X2xv bmdfbG9uZ19hY2N1bV90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAiX1NhdCB1bnNpZ25lZCBzaG9ydCBfQWNjdW0i LAoJCQkgICBzYXRfdW5zaWduZWRfc2hvcnRfYWNjdW1fdHlwZV9ub2RlKTsK ICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgIl9TYXQgdW5z aWduZWQgX0FjY3VtIiwKCQkJICAgc2F0X3Vuc2lnbmVkX2FjY3VtX3R5cGVf bm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJf U2F0IHVuc2lnbmVkIGxvbmcgX0FjY3VtIiwKCQkJICAgc2F0X3Vuc2lnbmVk X2xvbmdfYWNjdW1fdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSAoUklEX01BWCwgIl9TYXQgdW5zaWduZWQgbG9uZyBsb25nIF9BY2N1 bSIsCgkJCSAgIHNhdF91bnNpZ25lZF9sb25nX2xvbmdfYWNjdW1fdHlwZV9u b2RlKTsKCiAgICB9CgogIGxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1 aWxkX2RlY2wgKFRZUEVfREVDTCwKCQkJCQkgZ2V0X2lkZW50aWZpZXIgKCJj b21wbGV4IGludCIpLAoJCQkJCSBjb21wbGV4X2ludGVnZXJfdHlwZV9ub2Rl KSk7CiAgbGFuZ19ob29rcy5kZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAo VFlQRV9ERUNMLAoJCQkJCSBnZXRfaWRlbnRpZmllciAoImNvbXBsZXggZmxv YXQiKSwKCQkJCQkgY29tcGxleF9mbG9hdF90eXBlX25vZGUpKTsKICBsYW5n X2hvb2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0ws CgkJCQkJIGdldF9pZGVudGlmaWVyICgiY29tcGxleCBkb3VibGUiKSwKCQkJ CQkgY29tcGxleF9kb3VibGVfdHlwZV9ub2RlKSk7CiAgbGFuZ19ob29rcy5k ZWNscy5wdXNoZGVjbAogICAgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwgZ2V0 X2lkZW50aWZpZXIgKCJjb21wbGV4IGxvbmcgZG91YmxlIiksCgkJIGNvbXBs ZXhfbG9uZ19kb3VibGVfdHlwZV9ub2RlKSk7CgogIGlmIChjX2RpYWxlY3Rf Y3h4ICgpKQogICAgLyogRm9yIEMrKywgbWFrZSBmaWxlcHRyX3R5cGVfbm9k ZSBhIGRpc3RpbmN0IHZvaWQgKiB0eXBlIHVudGlsCiAgICAgICBGSUxFIHR5 cGUgaXMgZGVmaW5lZC4gICovCiAgICBmaWxlcHRyX3R5cGVfbm9kZSA9IGJ1 aWxkX3ZhcmlhbnRfdHlwZV9jb3B5IChwdHJfdHlwZV9ub2RlKTsKCiAgcmVj b3JkX2J1aWx0aW5fdHlwZSAoUklEX1ZPSUQsIE5VTEwsIHZvaWRfdHlwZV9u b2RlKTsKCiAgLyogU2V0IHRoZSBUWVBFX05BTUUgZm9yIGFueSB2YXJpYW50 cyB0aGF0IHdlcmUgYnVpbHQgYmVmb3JlCiAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSBnYXZlIG5hbWVzIHRvIHRoZSBidWlsdC1pbiB0eXBlcy4gKi8KICB7 CiAgICB0cmVlIHZvaWRfbmFtZSA9IFRZUEVfTkFNRSAodm9pZF90eXBlX25v ZGUpOwogICAgVFlQRV9OQU1FICh2b2lkX3R5cGVfbm9kZSkgPSBOVUxMX1RS RUU7CiAgICBUWVBFX05BTUUgKGJ1aWxkX3F1YWxpZmllZF90eXBlICh2b2lk X3R5cGVfbm9kZSwgVFlQRV9RVUFMX0NPTlNUKSkKICAgICAgPSB2b2lkX25h bWU7CiAgICBUWVBFX05BTUUgKHZvaWRfdHlwZV9ub2RlKSA9IHZvaWRfbmFt ZTsKICB9CgogIC8qIFRoaXMgbm9kZSBtdXN0IG5vdCBiZSBzaGFyZWQuICAq LwogIHZvaWRfemVyb19ub2RlID0gbWFrZV9ub2RlIChJTlRFR0VSX0NTVCk7 CiAgVFJFRV9UWVBFICh2b2lkX3plcm9fbm9kZSkgPSB2b2lkX3R5cGVfbm9k ZTsKCiAgdm9pZF9saXN0X25vZGUgPSBidWlsZF92b2lkX2xpc3Rfbm9kZSAo KTsKCiAgLyogTWFrZSBhIHR5cGUgdG8gYmUgdGhlIGRvbWFpbiBvZiBhIGZl dyBhcnJheSB0eXBlcwogICAgIHdob3NlIGRvbWFpbnMgZG9uJ3QgcmVhbGx5 IG1hdHRlci4KICAgICAyMDAgaXMgc21hbGwgZW5vdWdoIHRoYXQgaXQgYWx3 YXlzIGZpdHMgaW4gc2l6ZV90CiAgICAgYW5kIGxhcmdlIGVub3VnaCB0aGF0 IGl0IGNhbiBob2xkIG1vc3QgZnVuY3Rpb24gbmFtZXMgZm9yIHRoZQogICAg IGluaXRpYWxpemF0aW9ucyBvZiBfX0ZVTkNUSU9OX18gYW5kIF9fUFJFVFRZ X0ZVTkNUSU9OX18uICAqLwogIGFycmF5X2RvbWFpbl90eXBlID0gYnVpbGRf aW5kZXhfdHlwZSAoc2l6ZV9pbnQgKDIwMCkpOwoKICAvKiBNYWtlIGEgdHlw ZSBmb3IgYXJyYXlzIG9mIGNoYXJhY3RlcnMuCiAgICAgV2l0aCBsdWNrIG5v dGhpbmcgd2lsbCBldmVyIHJlYWxseSBkZXBlbmQgb24gdGhlIGxlbmd0aCBv ZiB0aGlzCiAgICAgYXJyYXkgdHlwZS4gICovCiAgY2hhcl9hcnJheV90eXBl X25vZGUKICAgID0gYnVpbGRfYXJyYXlfdHlwZSAoY2hhcl90eXBlX25vZGUs IGFycmF5X2RvbWFpbl90eXBlKTsKCiAgLyogTGlrZXdpc2UgZm9yIGFycmF5 cyBvZiBpbnRzLiAgKi8KICBpbnRfYXJyYXlfdHlwZV9ub2RlCiAgICA9IGJ1 aWxkX2FycmF5X3R5cGUgKGludGVnZXJfdHlwZV9ub2RlLCBhcnJheV9kb21h aW5fdHlwZSk7CgogIHN0cmluZ190eXBlX25vZGUgPSBidWlsZF9wb2ludGVy X3R5cGUgKGNoYXJfdHlwZV9ub2RlKTsKICBjb25zdF9zdHJpbmdfdHlwZV9u b2RlCiAgICA9IGJ1aWxkX3BvaW50ZXJfdHlwZSAoYnVpbGRfcXVhbGlmaWVk X3R5cGUKCQkJICAoY2hhcl90eXBlX25vZGUsIFRZUEVfUVVBTF9DT05TVCkp OwoKICAvKiBUaGlzIGlzIHNwZWNpYWwgZm9yIEMrKyBzbyBmdW5jdGlvbnMg Y2FuIGJlIG92ZXJsb2FkZWQuICAqLwogIHdjaGFyX3R5cGVfbm9kZSA9IGdl dF9pZGVudGlmaWVyIChNT0RJRklFRF9XQ0hBUl9UWVBFKTsKICB3Y2hhcl90 eXBlX25vZGUgPSBUUkVFX1RZUEUgKGlkZW50aWZpZXJfZ2xvYmFsX3ZhbHVl ICh3Y2hhcl90eXBlX25vZGUpKTsKICB3Y2hhcl90eXBlX3NpemUgPSBUWVBF X1BSRUNJU0lPTiAod2NoYXJfdHlwZV9ub2RlKTsKICBpZiAoY19kaWFsZWN0 X2N4eCAoKSkKICAgIHsKICAgICAgaWYgKFRZUEVfVU5TSUdORUQgKHdjaGFy X3R5cGVfbm9kZSkpCgl3Y2hhcl90eXBlX25vZGUgPSBtYWtlX3Vuc2lnbmVk X3R5cGUgKHdjaGFyX3R5cGVfc2l6ZSk7CiAgICAgIGVsc2UKCXdjaGFyX3R5 cGVfbm9kZSA9IG1ha2Vfc2lnbmVkX3R5cGUgKHdjaGFyX3R5cGVfc2l6ZSk7 CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9XQ0hBUiwgIndjaGFy X3QiLCB3Y2hhcl90eXBlX25vZGUpOwogICAgfQogIGVsc2UKICAgIHsKICAg ICAgc2lnbmVkX3djaGFyX3R5cGVfbm9kZSA9IGNfY29tbW9uX3NpZ25lZF90 eXBlICh3Y2hhcl90eXBlX25vZGUpOwogICAgICB1bnNpZ25lZF93Y2hhcl90 eXBlX25vZGUgPSBjX2NvbW1vbl91bnNpZ25lZF90eXBlICh3Y2hhcl90eXBl X25vZGUpOwogICAgfQoKICAvKiBUaGlzIGlzIGZvciB3aWRlIHN0cmluZyBj b25zdGFudHMuICAqLwogIHdjaGFyX2FycmF5X3R5cGVfbm9kZQogICAgPSBi dWlsZF9hcnJheV90eXBlICh3Y2hhcl90eXBlX25vZGUsIGFycmF5X2RvbWFp bl90eXBlKTsKCiAgd2ludF90eXBlX25vZGUgPQogICAgVFJFRV9UWVBFIChp ZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIgKFdJTlRf VFlQRSkpKTsKCiAgaW50bWF4X3R5cGVfbm9kZSA9CiAgICBUUkVFX1RZUEUg KGlkZW50aWZpZXJfZ2xvYmFsX3ZhbHVlIChnZXRfaWRlbnRpZmllciAoSU5U TUFYX1RZUEUpKSk7CiAgdWludG1heF90eXBlX25vZGUgPQogICAgVFJFRV9U WVBFIChpZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIg KFVJTlRNQVhfVFlQRSkpKTsKCiAgZGVmYXVsdF9mdW5jdGlvbl90eXBlID0g YnVpbGRfZnVuY3Rpb25fdHlwZSAoaW50ZWdlcl90eXBlX25vZGUsIE5VTExf VFJFRSk7CiAgcHRyZGlmZl90eXBlX25vZGUKICAgID0gVFJFRV9UWVBFIChp ZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIgKFBUUkRJ RkZfVFlQRSkpKTsKICB1bnNpZ25lZF9wdHJkaWZmX3R5cGVfbm9kZSA9IGNf Y29tbW9uX3Vuc2lnbmVkX3R5cGUgKHB0cmRpZmZfdHlwZV9ub2RlKTsKCiAg bGFuZ19ob29rcy5kZWNscy5wdXNoZGVjbAogICAgKGJ1aWxkX2RlY2wgKFRZ UEVfREVDTCwgZ2V0X2lkZW50aWZpZXIgKCJfX2J1aWx0aW5fdmFfbGlzdCIp LAoJCSB2YV9saXN0X3R5cGVfbm9kZSkpOwoKICBpZiAoVFJFRV9DT0RFICh2 YV9saXN0X3R5cGVfbm9kZSkgPT0gQVJSQVlfVFlQRSkKICAgIHsKICAgICAg dmFfbGlzdF9hcmdfdHlwZV9ub2RlID0gdmFfbGlzdF9yZWZfdHlwZV9ub2Rl ID0KCWJ1aWxkX3BvaW50ZXJfdHlwZSAoVFJFRV9UWVBFICh2YV9saXN0X3R5 cGVfbm9kZSkpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgdmFfbGlzdF9h cmdfdHlwZV9ub2RlID0gdmFfbGlzdF90eXBlX25vZGU7CiAgICAgIHZhX2xp c3RfcmVmX3R5cGVfbm9kZSA9IGJ1aWxkX3JlZmVyZW5jZV90eXBlICh2YV9s aXN0X3R5cGVfbm9kZSk7CiAgICB9CgogIGlmICghZmxhZ19wcmVwcm9jZXNz X29ubHkpCiAgICBjX2RlZmluZV9idWlsdGlucyAodmFfbGlzdF9yZWZfdHlw ZV9ub2RlLCB2YV9saXN0X2FyZ190eXBlX25vZGUpOwoKICBtYWluX2lkZW50 aWZpZXJfbm9kZSA9IGdldF9pZGVudGlmaWVyICgibWFpbiIpOwoKICAvKiBD cmVhdGUgdGhlIGJ1aWx0LWluIF9fbnVsbCBub2RlLiAgSXQgaXMgaW1wb3J0 YW50IHRoYXQgdGhpcyBpcwogICAgIG5vdCBzaGFyZWQuICAqLwogIG51bGxf bm9kZSA9IG1ha2Vfbm9kZSAoSU5URUdFUl9DU1QpOwogIFRSRUVfVFlQRSAo bnVsbF9ub2RlKSA9IGNfY29tbW9uX3R5cGVfZm9yX3NpemUgKFBPSU5URVJf U0laRSwgMCk7CgogIC8qIFNpbmNlIGJ1aWx0aW5fdHlwZXMgaXNuJ3QgZ2Mn ZWQsIGRvbid0IGV4cG9ydCB0aGVzZSBub2Rlcy4gICovCiAgbWVtc2V0IChi dWlsdGluX3R5cGVzLCAwLCBzaXplb2YgKGJ1aWx0aW5fdHlwZXMpKTsKfQoK LyogTG9vayB1cCB0aGUgZnVuY3Rpb24gaW4gYnVpbHRfaW5fZGVjbHMgdGhh dCBjb3JyZXNwb25kcyB0byBERUNMCiAgIGFuZCBzZXQgQVNNU1BFQyBhcyBp dHMgdXNlciBhc3NlbWJsZXIgbmFtZS4gIERFQ0wgbXVzdCBiZSBhCiAgIGZ1 bmN0aW9uIGRlY2wgdGhhdCBkZWNsYXJlcyBhIGJ1aWx0aW4uICAqLwoKdm9p ZApzZXRfYnVpbHRpbl91c2VyX2Fzc2VtYmxlcl9uYW1lICh0cmVlIGRlY2ws IGNvbnN0IGNoYXIgKmFzbXNwZWMpCnsKICB0cmVlIGJ1aWx0aW47CiAgZ2Nj X2Fzc2VydCAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCgkg ICAgICAmJiBERUNMX0JVSUxUX0lOX0NMQVNTIChkZWNsKSA9PSBCVUlMVF9J Tl9OT1JNQUwKCSAgICAgICYmIGFzbXNwZWMgIT0gMCk7CgogIGJ1aWx0aW4g PSBidWlsdF9pbl9kZWNscyBbREVDTF9GVU5DVElPTl9DT0RFIChkZWNsKV07 CiAgc2V0X3VzZXJfYXNzZW1ibGVyX25hbWUgKGJ1aWx0aW4sIGFzbXNwZWMp OwogIGlmIChERUNMX0ZVTkNUSU9OX0NPREUgKGRlY2wpID09IEJVSUxUX0lO X01FTUNQWSkKICAgIGluaXRfYmxvY2tfbW92ZV9mbiAoYXNtc3BlYyk7CiAg ZWxzZSBpZiAoREVDTF9GVU5DVElPTl9DT0RFIChkZWNsKSA9PSBCVUlMVF9J Tl9NRU1TRVQpCiAgICBpbml0X2Jsb2NrX2NsZWFyX2ZuIChhc21zcGVjKTsK fQoKLyogVGhlIG51bWJlciBvZiBuYW1lZCBjb21wb3VuZC1saXRlcmFscyBn ZW5lcmF0ZWQgdGh1cyBmYXIuICAqLwpzdGF0aWMgR1RZKCgpKSBpbnQgY29t cG91bmRfbGl0ZXJhbF9udW1iZXI7CgovKiBTZXQgREVDTF9OQU1FIGZvciBE RUNMLCBhIFZBUl9ERUNMIGZvciBhIGNvbXBvdW5kLWxpdGVyYWwuICAqLwoK dm9pZApzZXRfY29tcG91bmRfbGl0ZXJhbF9uYW1lICh0cmVlIGRlY2wpCnsK ICBjaGFyICpuYW1lOwogIEFTTV9GT1JNQVRfUFJJVkFURV9OQU1FIChuYW1l LCAiX19jb21wb3VuZF9saXRlcmFsIiwKCQkJICAgY29tcG91bmRfbGl0ZXJh bF9udW1iZXIpOwogIGNvbXBvdW5kX2xpdGVyYWxfbnVtYmVyKys7CiAgREVD TF9OQU1FIChkZWNsKSA9IGdldF9pZGVudGlmaWVyIChuYW1lKTsKfQoKdHJl ZQpidWlsZF92YV9hcmcgKHRyZWUgZXhwciwgdHJlZSB0eXBlKQp7CiAgcmV0 dXJuIGJ1aWxkMSAoVkFfQVJHX0VYUFIsIHR5cGUsIGV4cHIpOwp9CgoKLyog TGlua2VkIGxpc3Qgb2YgZGlzYWJsZWQgYnVpbHQtaW4gZnVuY3Rpb25zLiAg Ki8KCnR5cGVkZWYgc3RydWN0IGRpc2FibGVkX2J1aWx0aW4KewogIGNvbnN0 IGNoYXIgKm5hbWU7CiAgc3RydWN0IGRpc2FibGVkX2J1aWx0aW4gKm5leHQ7 Cn0gZGlzYWJsZWRfYnVpbHRpbjsKc3RhdGljIGRpc2FibGVkX2J1aWx0aW4g KmRpc2FibGVkX2J1aWx0aW5zID0gTlVMTDsKCnN0YXRpYyBib29sIGJ1aWx0 aW5fZnVuY3Rpb25fZGlzYWJsZWRfcCAoY29uc3QgY2hhciAqKTsKCi8qIERp c2FibGUgYSBidWlsdC1pbiBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgLWZuby1i dWlsdGluLU5BTUUuICBJZiBOQU1FCiAgIGJlZ2lucyB3aXRoICJfX2J1aWx0 aW5fIiwgZ2l2ZSBhbiBlcnJvci4gICovCgp2b2lkCmRpc2FibGVfYnVpbHRp bl9mdW5jdGlvbiAoY29uc3QgY2hhciAqbmFtZSkKewogIGlmIChzdHJuY21w IChuYW1lLCAiX19idWlsdGluXyIsIHN0cmxlbiAoIl9fYnVpbHRpbl8iKSkg PT0gMCkKICAgIGVycm9yICgiY2Fubm90IGRpc2FibGUgYnVpbHQtaW4gZnVu Y3Rpb24gJXFzIiwgbmFtZSk7CiAgZWxzZQogICAgewogICAgICBkaXNhYmxl ZF9idWlsdGluICpuZXdfZGlzYWJsZWRfYnVpbHRpbiA9IFhORVcgKGRpc2Fi bGVkX2J1aWx0aW4pOwogICAgICBuZXdfZGlzYWJsZWRfYnVpbHRpbi0+bmFt ZSA9IG5hbWU7CiAgICAgIG5ld19kaXNhYmxlZF9idWlsdGluLT5uZXh0ID0g ZGlzYWJsZWRfYnVpbHRpbnM7CiAgICAgIGRpc2FibGVkX2J1aWx0aW5zID0g bmV3X2Rpc2FibGVkX2J1aWx0aW47CiAgICB9Cn0KCgovKiBSZXR1cm4gdHJ1 ZSBpZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gTkFNRSBoYXMgYmVlbiBkaXNh YmxlZCwgZmFsc2UKICAgb3RoZXJ3aXNlLiAgKi8KCnN0YXRpYyBib29sCmJ1 aWx0aW5fZnVuY3Rpb25fZGlzYWJsZWRfcCAoY29uc3QgY2hhciAqbmFtZSkK ewogIGRpc2FibGVkX2J1aWx0aW4gKnA7CiAgZm9yIChwID0gZGlzYWJsZWRf YnVpbHRpbnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCiAgICB7CiAgICAg IGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCglyZXR1cm4gdHJ1 ZTsKICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCgovKiBXb3JrZXIgZm9yIERF Rl9CVUlMVElOLgogICBQb3NzaWJseSBkZWZpbmUgYSBidWlsdGluIGZ1bmN0 aW9uIHdpdGggb25lIG9yIHR3byBuYW1lcy4KICAgRG9lcyBub3QgZGVjbGFy ZSBhIG5vbi1fX2J1aWx0aW5fIGZ1bmN0aW9uIGlmIGZsYWdfbm9fYnVpbHRp biwgb3IgaWYKICAgbm9uYW5zaV9wIGFuZCBmbGFnX25vX25vbmFuc2lfYnVp bHRpbi4gICovCgpzdGF0aWMgdm9pZApkZWZfYnVpbHRpbl8xIChlbnVtIGJ1 aWx0X2luX2Z1bmN0aW9uIGZuY29kZSwKCSAgICAgICBjb25zdCBjaGFyICpu YW1lLAoJICAgICAgIGVudW0gYnVpbHRfaW5fY2xhc3MgZm5jbGFzcywKCSAg ICAgICB0cmVlIGZudHlwZSwgdHJlZSBsaWJ0eXBlLAoJICAgICAgIGJvb2wg Ym90aF9wLCBib29sIGZhbGxiYWNrX3AsIGJvb2wgbm9uYW5zaV9wLAoJICAg ICAgIHRyZWUgZm5hdHRycywgYm9vbCBpbXBsaWNpdF9wKQp7CiAgdHJlZSBk ZWNsOwogIGNvbnN0IGNoYXIgKmxpYm5hbWU7CgogIGlmIChmbnR5cGUgPT0g ZXJyb3JfbWFya19ub2RlKQogICAgcmV0dXJuOwoKICBnY2NfYXNzZXJ0ICgo IWJvdGhfcCAmJiAhZmFsbGJhY2tfcCkKCSAgICAgIHx8ICFzdHJuY21wIChu YW1lLCAiX19idWlsdGluXyIsCgkJCSAgIHN0cmxlbiAoIl9fYnVpbHRpbl8i KSkpOwoKICBsaWJuYW1lID0gbmFtZSArIHN0cmxlbiAoIl9fYnVpbHRpbl8i KTsKICBkZWNsID0gYWRkX2J1aWx0aW5fZnVuY3Rpb24gKG5hbWUsIGZudHlw ZSwgZm5jb2RlLCBmbmNsYXNzLAoJCQkgICAgICAgKGZhbGxiYWNrX3AgPyBs aWJuYW1lIDogTlVMTCksCgkJCSAgICAgICBmbmF0dHJzKTsKICBpZiAoYm90 aF9wCiAgICAgICYmICFmbGFnX25vX2J1aWx0aW4gJiYgIWJ1aWx0aW5fZnVu Y3Rpb25fZGlzYWJsZWRfcCAobGlibmFtZSkKICAgICAgJiYgIShub25hbnNp X3AgJiYgZmxhZ19ub19ub25hbnNpX2J1aWx0aW4pKQogICAgYWRkX2J1aWx0 aW5fZnVuY3Rpb24gKGxpYm5hbWUsIGxpYnR5cGUsIGZuY29kZSwgZm5jbGFz cywKCQkJICBOVUxMLCBmbmF0dHJzKTsKCiAgYnVpbHRfaW5fZGVjbHNbKGlu dCkgZm5jb2RlXSA9IGRlY2w7CiAgaWYgKGltcGxpY2l0X3ApCiAgICBpbXBs aWNpdF9idWlsdF9pbl9kZWNsc1soaW50KSBmbmNvZGVdID0gZGVjbDsKfQoM Ci8qIE5vbnplcm8gaWYgdGhlIHR5cGUgVCBwcm9tb3RlcyB0byBpbnQuICBU aGlzIGlzIChuZWFybHkpIHRoZQogICBpbnRlZ3JhbCBwcm9tb3Rpb25zIGRl ZmluZWQgaW4gSVNPIEM5OSA2LjMuMS4xLzIuICAqLwoKYm9vbApjX3Byb21v dGluZ19pbnRlZ2VyX3R5cGVfcCAoY29uc3RfdHJlZSB0KQp7CiAgc3dpdGNo IChUUkVFX0NPREUgKHQpKQogICAgewogICAgY2FzZSBJTlRFR0VSX1RZUEU6 CiAgICAgIHJldHVybiAoVFlQRV9NQUlOX1ZBUklBTlQgKHQpID09IGNoYXJf dHlwZV9ub2RlCgkgICAgICB8fCBUWVBFX01BSU5fVkFSSUFOVCAodCkgPT0g c2lnbmVkX2NoYXJfdHlwZV9ub2RlCgkgICAgICB8fCBUWVBFX01BSU5fVkFS SUFOVCAodCkgPT0gdW5zaWduZWRfY2hhcl90eXBlX25vZGUKCSAgICAgIHx8 IFRZUEVfTUFJTl9WQVJJQU5UICh0KSA9PSBzaG9ydF9pbnRlZ2VyX3R5cGVf bm9kZQoJICAgICAgfHwgVFlQRV9NQUlOX1ZBUklBTlQgKHQpID09IHNob3J0 X3Vuc2lnbmVkX3R5cGVfbm9kZQoJICAgICAgfHwgVFlQRV9QUkVDSVNJT04g KHQpIDwgVFlQRV9QUkVDSVNJT04gKGludGVnZXJfdHlwZV9ub2RlKSk7Cgog ICAgY2FzZSBFTlVNRVJBTF9UWVBFOgogICAgICAvKiA/Pz8gVGVjaG5pY2Fs bHkgYWxsIGVudW1lcmF0aW9ucyBub3QgbGFyZ2VyIHRoYW4gYW4gaW50Cgkg cHJvbW90ZSB0byBhbiBpbnQuICBCdXQgdGhpcyBpcyB1c2VkIGFsb25nIGNv ZGUgcGF0aHMKCSB0aGF0IG9ubHkgd2FudCB0byBub3RpY2UgYSBzaXplIGNo YW5nZS4gICovCiAgICAgIHJldHVybiBUWVBFX1BSRUNJU0lPTiAodCkgPCBU WVBFX1BSRUNJU0lPTiAoaW50ZWdlcl90eXBlX25vZGUpOwoKICAgIGNhc2Ug Qk9PTEVBTl9UWVBFOgogICAgICByZXR1cm4gMTsKCiAgICBkZWZhdWx0Ogog ICAgICByZXR1cm4gMDsKICAgIH0KfQoKLyogUmV0dXJuIDEgaWYgUEFSTVMg c3BlY2lmaWVzIGEgZml4ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgYW5k IG5vbmUgb2YgdGhlaXIgdHlwZXMgaXMgYWZmZWN0ZWQgYnkgZGVmYXVsdCBw cm9tb3Rpb25zLiAgKi8KCmludApzZWxmX3Byb21vdGluZ19hcmdzX3AgKGNv bnN0X3RyZWUgcGFybXMpCnsKICBjb25zdF90cmVlIHQ7CiAgZm9yICh0ID0g cGFybXM7IHQ7IHQgPSBUUkVFX0NIQUlOICh0KSkKICAgIHsKICAgICAgdHJl ZSB0eXBlID0gVFJFRV9WQUxVRSAodCk7CgogICAgICBpZiAodHlwZSA9PSBl cnJvcl9tYXJrX25vZGUpCgljb250aW51ZTsKCiAgICAgIGlmIChUUkVFX0NI QUlOICh0KSA9PSAwICYmIHR5cGUgIT0gdm9pZF90eXBlX25vZGUpCglyZXR1 cm4gMDsKCiAgICAgIGlmICh0eXBlID09IDApCglyZXR1cm4gMDsKCiAgICAg IGlmIChUWVBFX01BSU5fVkFSSUFOVCAodHlwZSkgPT0gZmxvYXRfdHlwZV9u b2RlKQoJcmV0dXJuIDA7CgogICAgICBpZiAoY19wcm9tb3RpbmdfaW50ZWdl cl90eXBlX3AgKHR5cGUpKQoJcmV0dXJuIDA7CiAgICB9CiAgcmV0dXJuIDE7 Cn0KCi8qIFJlY3Vyc2l2ZWx5IGV4YW1pbmVzIHRoZSBhcnJheSBlbGVtZW50 cyBvZiBUWVBFLCB1bnRpbCBhIG5vbi1hcnJheQogICBlbGVtZW50IHR5cGUg aXMgZm91bmQuICAqLwoKdHJlZQpzdHJpcF9hcnJheV90eXBlcyAodHJlZSB0 eXBlKQp7CiAgd2hpbGUgKFRSRUVfQ09ERSAodHlwZSkgPT0gQVJSQVlfVFlQ RSkKICAgIHR5cGUgPSBUUkVFX1RZUEUgKHR5cGUpOwoKICByZXR1cm4gdHlw ZTsKfQoKLyogUmVjdXJzaXZlbHkgcmVtb3ZlIGFueSAnKicgb3IgJyYnIG9w ZXJhdG9yIGZyb20gVFlQRS4gICovCnRyZWUKc3RyaXBfcG9pbnRlcl9vcGVy YXRvciAodHJlZSB0KQp7CiAgd2hpbGUgKFBPSU5URVJfVFlQRV9QICh0KSkK ICAgIHQgPSBUUkVFX1RZUEUgKHQpOwogIHJldHVybiB0Owp9CgovKiBSZWN1 cnNpdmVseSByZW1vdmUgcG9pbnRlciBvciBhcnJheSB0eXBlIGZyb20gVFlQ RS4gKi8KdHJlZQpzdHJpcF9wb2ludGVyX29yX2FycmF5X3R5cGVzICh0cmVl IHQpCnsKICB3aGlsZSAoVFJFRV9DT0RFICh0KSA9PSBBUlJBWV9UWVBFIHx8 IFBPSU5URVJfVFlQRV9QICh0KSkKICAgIHQgPSBUUkVFX1RZUEUgKHQpOwog IHJldHVybiB0Owp9CgovKiBVc2VkIHRvIGNvbXBhcmUgY2FzZSBsYWJlbHMu ICBLMSBhbmQgSzIgYXJlIGFjdHVhbGx5IHRyZWUgbm9kZXMKICAgcmVwcmVz ZW50aW5nIGNhc2UgbGFiZWxzLCBvciBOVUxMX1RSRUUgZm9yIGEgYGRlZmF1 bHQnIGxhYmVsLgogICBSZXR1cm5zIC0xIGlmIEsxIGlzIG9yZGVyZWQgYmVm b3JlIEsyLCAtMSBpZiBLMSBpcyBvcmRlcmVkIGFmdGVyCiAgIEsyLCBhbmQg MCBpZiBLMSBhbmQgSzIgYXJlIGVxdWFsLiAgKi8KCmludApjYXNlX2NvbXBh cmUgKHNwbGF5X3RyZWVfa2V5IGsxLCBzcGxheV90cmVlX2tleSBrMikKewog IC8qIENvbnNpZGVyIGEgTlVMTCBrZXkgKHN1Y2ggYXMgYXJpc2VzIHdpdGgg YSBgZGVmYXVsdCcgbGFiZWwpIHRvIGJlCiAgICAgc21hbGxlciB0aGFuIGFu eXRoaW5nIGVsc2UuICAqLwogIGlmICghazEpCiAgICByZXR1cm4gazIgPyAt MSA6IDA7CiAgZWxzZSBpZiAoIWsyKQogICAgcmV0dXJuIGsxID8gMSA6IDA7 CgogIHJldHVybiB0cmVlX2ludF9jc3RfY29tcGFyZSAoKHRyZWUpIGsxLCAo dHJlZSkgazIpOwp9CgovKiBQcm9jZXNzIGEgY2FzZSBsYWJlbCBmb3IgdGhl IHJhbmdlIExPV19WQUxVRSAuLi4gSElHSF9WQUxVRS4gIElmCiAgIExPV19W QUxVRSBhbmQgSElHSF9WQUxVRSBhcmUgYm90aCBOVUxMX1RSRUUgdGhlbiB0 aGlzIGNhc2UgbGFiZWwgaXMKICAgYWN0dWFsbHkgYSBgZGVmYXVsdCcgbGFi ZWwuICBJZiBvbmx5IEhJR0hfVkFMVUUgaXMgTlVMTF9UUkVFLCB0aGVuCiAg IGNhc2UgbGFiZWwgd2FzIGRlY2xhcmVkIHVzaW5nIHRoZSB1c3VhbCBDL0Mr KyBzeW50YXgsIHJhdGhlciB0aGFuCiAgIHRoZSBHTlUgY2FzZSByYW5nZSBl eHRlbnNpb24uICBDQVNFUyBpcyBhIHRyZWUgY29udGFpbmluZyBhbGwgdGhl CiAgIGNhc2UgcmFuZ2VzIHByb2Nlc3NlZCBzbyBmYXI7IENPTkQgaXMgdGhl IGNvbmRpdGlvbiBmb3IgdGhlCiAgIHN3aXRjaC1zdGF0ZW1lbnQgaXRzZWxm LiAgUmV0dXJucyB0aGUgQ0FTRV9MQUJFTF9FWFBSIGNyZWF0ZWQsIG9yCiAg IEVSUk9SX01BUktfTk9ERSBpZiBubyBDQVNFX0xBQkVMX0VYUFIgaXMgY3Jl YXRlZC4gICovCgp0cmVlCmNfYWRkX2Nhc2VfbGFiZWwgKHNwbGF5X3RyZWUg Y2FzZXMsIHRyZWUgY29uZCwgdHJlZSBvcmlnX3R5cGUsCgkJICB0cmVlIGxv d192YWx1ZSwgdHJlZSBoaWdoX3ZhbHVlKQp7CiAgdHJlZSB0eXBlOwogIHRy ZWUgbGFiZWw7CiAgdHJlZSBjYXNlX2xhYmVsOwogIHNwbGF5X3RyZWVfbm9k ZSBub2RlOwoKICAvKiBDcmVhdGUgdGhlIExBQkVMX0RFQ0wgaXRzZWxmLiAg Ki8KICBsYWJlbCA9IGNyZWF0ZV9hcnRpZmljaWFsX2xhYmVsICgpOwoKICAv KiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgc3dpdGNo IGNvbmRpdGlvbiwgYmFpbCBub3cKICAgICBiZWZvcmUgd2UgZ2V0IG1vcmUg Y29uZnVzZWQuICAqLwogIGlmICghY29uZCB8fCBjb25kID09IGVycm9yX21h cmtfbm9kZSkKICAgIGdvdG8gZXJyb3Jfb3V0OwoKICBpZiAoKGxvd192YWx1 ZSAmJiBUUkVFX1RZUEUgKGxvd192YWx1ZSkKICAgICAgICYmIFBPSU5URVJf VFlQRV9QIChUUkVFX1RZUEUgKGxvd192YWx1ZSkpKQogICAgICB8fCAoaGln aF92YWx1ZSAmJiBUUkVFX1RZUEUgKGhpZ2hfdmFsdWUpCgkgICYmIFBPSU5U RVJfVFlQRV9QIChUUkVFX1RZUEUgKGhpZ2hfdmFsdWUpKSkpCiAgICB7CiAg ICAgIGVycm9yICgicG9pbnRlcnMgYXJlIG5vdCBwZXJtaXR0ZWQgYXMgY2Fz ZSB2YWx1ZXMiKTsKICAgICAgZ290byBlcnJvcl9vdXQ7CiAgICB9CgogIC8q IENhc2UgcmFuZ2VzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwogIGlmICho aWdoX3ZhbHVlICYmIHBlZGFudGljKQogICAgcGVkd2FybiAoInJhbmdlIGV4 cHJlc3Npb25zIGluIHN3aXRjaCBzdGF0ZW1lbnRzIGFyZSBub24tc3RhbmRh cmQiKTsKCiAgdHlwZSA9IFRSRUVfVFlQRSAoY29uZCk7CiAgaWYgKGxvd192 YWx1ZSkKICAgIHsKICAgICAgbG93X3ZhbHVlID0gY2hlY2tfY2FzZV92YWx1 ZSAobG93X3ZhbHVlKTsKICAgICAgbG93X3ZhbHVlID0gY29udmVydF9hbmRf Y2hlY2sgKHR5cGUsIGxvd192YWx1ZSk7CiAgICAgIGlmIChsb3dfdmFsdWUg PT0gZXJyb3JfbWFya19ub2RlKQoJZ290byBlcnJvcl9vdXQ7CiAgICB9CiAg aWYgKGhpZ2hfdmFsdWUpCiAgICB7CiAgICAgIGhpZ2hfdmFsdWUgPSBjaGVj a19jYXNlX3ZhbHVlIChoaWdoX3ZhbHVlKTsKICAgICAgaGlnaF92YWx1ZSA9 IGNvbnZlcnRfYW5kX2NoZWNrICh0eXBlLCBoaWdoX3ZhbHVlKTsKICAgICAg aWYgKGhpZ2hfdmFsdWUgPT0gZXJyb3JfbWFya19ub2RlKQoJZ290byBlcnJv cl9vdXQ7CiAgICB9CgogIGlmIChsb3dfdmFsdWUgJiYgaGlnaF92YWx1ZSkK ICAgIHsKICAgICAgLyogSWYgdGhlIExPV19WQUxVRSBhbmQgSElHSF9WQUxV RSBhcmUgdGhlIHNhbWUsIHRoZW4gdGhpcyBpc24ndAoJIHJlYWxseSBhIGNh c2UgcmFuZ2UsIGV2ZW4gdGhvdWdoIGl0IHdhcyB3cml0dGVuIHRoYXQgd2F5 LgoJIFJlbW92ZSB0aGUgSElHSF9WQUxVRSB0byBzaW1wbGlmeSBsYXRlciBw cm9jZXNzaW5nLiAgKi8KICAgICAgaWYgKHRyZWVfaW50X2NzdF9lcXVhbCAo bG93X3ZhbHVlLCBoaWdoX3ZhbHVlKSkKCWhpZ2hfdmFsdWUgPSBOVUxMX1RS RUU7CiAgICAgIGVsc2UgaWYgKCF0cmVlX2ludF9jc3RfbHQgKGxvd192YWx1 ZSwgaGlnaF92YWx1ZSkpCgl3YXJuaW5nICgwLCAiZW1wdHkgcmFuZ2Ugc3Bl Y2lmaWVkIik7CiAgICB9CgogIC8qIFNlZSBpZiB0aGUgY2FzZSBpcyBpbiBy YW5nZSBvZiB0aGUgdHlwZSBvZiB0aGUgb3JpZ2luYWwgdGVzdGluZwogICAg IGV4cHJlc3Npb24uICBJZiBib3RoIGxvd192YWx1ZSBhbmQgaGlnaF92YWx1 ZSBhcmUgb3V0IG9mIHJhbmdlLAogICAgIGRvbid0IGluc2VydCB0aGUgY2Fz ZSBsYWJlbCBhbmQgcmV0dXJuIE5VTExfVFJFRS4gICovCiAgaWYgKGxvd192 YWx1ZQogICAgICAmJiAhY2hlY2tfY2FzZV9ib3VuZHMgKHR5cGUsIG9yaWdf dHlwZSwKCQkJICAgICAmbG93X3ZhbHVlLCBoaWdoX3ZhbHVlID8gJmhpZ2hf dmFsdWUgOiBOVUxMKSkKICAgIHJldHVybiBOVUxMX1RSRUU7CgogIC8qIExv b2sgdXAgdGhlIExPV19WQUxVRSBpbiB0aGUgdGFibGUgb2YgY2FzZSBsYWJl bHMgd2UgYWxyZWFkeQogICAgIGhhdmUuICAqLwogIG5vZGUgPSBzcGxheV90 cmVlX2xvb2t1cCAoY2FzZXMsIChzcGxheV90cmVlX2tleSkgbG93X3ZhbHVl KTsKICAvKiBJZiB0aGVyZSB3YXMgbm90IGFuIGV4YWN0IG1hdGNoLCBjaGVj ayBmb3Igb3ZlcmxhcHBpbmcgcmFuZ2VzLgogICAgIFRoZXJlJ3Mgbm8gbmVl ZCB0byBkbyB0aGlzIGlmIHRoZXJlJ3Mgbm8gTE9XX1ZBTFVFIG9yIEhJR0hf VkFMVUU7CiAgICAgdGhhdCdzIGEgYGRlZmF1bHQnIGxhYmVsIGFuZCB0aGUg b25seSBvdmVybGFwIGlzIGFuIGV4YWN0IG1hdGNoLiAgKi8KICBpZiAoIW5v ZGUgJiYgKGxvd192YWx1ZSB8fCBoaWdoX3ZhbHVlKSkKICAgIHsKICAgICAg c3BsYXlfdHJlZV9ub2RlIGxvd19ib3VuZDsKICAgICAgc3BsYXlfdHJlZV9u b2RlIGhpZ2hfYm91bmQ7CgogICAgICAvKiBFdmVuIHRob3VnaCB0aGVyZSB3 YXNuJ3QgYW4gZXhhY3QgbWF0Y2gsIHRoZXJlIG1pZ2h0IGJlIGFuCgkgb3Zl cmxhcCBiZXR3ZWVuIHRoaXMgY2FzZSByYW5nZSBhbmQgYW5vdGhlciBjYXNl IHJhbmdlLgoJIFNpbmNlIHdlJ3ZlIChpbmR1Y3RpdmVseSkgbm90IGFsbG93 ZWQgYW55IG92ZXJsYXBwaW5nIGNhc2UKCSByYW5nZXMsIHdlIHNpbXBseSBu ZWVkIHRvIGZpbmQgdGhlIGdyZWF0ZXN0IGxvdyBjYXNlIGxhYmVsCgkgdGhh dCBpcyBzbWFsbGVyIHRoYXQgTE9XX1ZBTFVFLCBhbmQgdGhlIHNtYWxsZXN0 IGxvdyBjYXNlCgkgbGFiZWwgdGhhdCBpcyBncmVhdGVyIHRoYW4gTE9XX1ZB TFVFLiAgSWYgdGhlcmUgaXMgYW4gb3ZlcmxhcAoJIGl0IHdpbGwgb2NjdXIg aW4gb25lIG9mIHRoZXNlIHR3byByYW5nZXMuICAqLwogICAgICBsb3dfYm91 bmQgPSBzcGxheV90cmVlX3ByZWRlY2Vzc29yIChjYXNlcywKCQkJCQkgIChz cGxheV90cmVlX2tleSkgbG93X3ZhbHVlKTsKICAgICAgaGlnaF9ib3VuZCA9 IHNwbGF5X3RyZWVfc3VjY2Vzc29yIChjYXNlcywKCQkJCQkgKHNwbGF5X3Ry ZWVfa2V5KSBsb3dfdmFsdWUpOwoKICAgICAgLyogQ2hlY2sgdG8gc2VlIGlm IHRoZSBMT1dfQk9VTkQgb3ZlcmxhcHMuICBJdCBpcyBzbWFsbGVyIHRoYW4K CSB0aGUgTE9XX1ZBTFVFLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNr IHVubGVzcyB0aGUKCSBMT1dfQk9VTkQgaXMgaW4gZmFjdCBpdHNlbGYgYSBj YXNlIHJhbmdlLiAgKi8KICAgICAgaWYgKGxvd19ib3VuZAoJICAmJiBDQVNF X0hJR0ggKCh0cmVlKSBsb3dfYm91bmQtPnZhbHVlKQoJICAmJiB0cmVlX2lu dF9jc3RfY29tcGFyZSAoQ0FTRV9ISUdIICgodHJlZSkgbG93X2JvdW5kLT52 YWx1ZSksCgkJCQkgICAgbG93X3ZhbHVlKSA+PSAwKQoJbm9kZSA9IGxvd19i b3VuZDsKICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBISUdIX0JPVU5E IG92ZXJsYXBzLiAgVGhlIGxvdyBlbmQgb2YgdGhhdAoJIHJhbmdlIGlzIGJp Z2dlciB0aGFuIHRoZSBsb3cgZW5kIG9mIHRoZSBjdXJyZW50IHJhbmdlLCBz byB3ZQoJIGFyZSBvbmx5IGludGVyZXN0ZWQgaWYgdGhlIGN1cnJlbnQgcmFu Z2UgaXMgYSByZWFsIHJhbmdlLCBhbmQKCSBub3QgYW4gb3JkaW5hcnkgY2Fz ZSBsYWJlbC4gICovCiAgICAgIGVsc2UgaWYgKGhpZ2hfYm91bmQKCSAgICAg ICAmJiBoaWdoX3ZhbHVlCgkgICAgICAgJiYgKHRyZWVfaW50X2NzdF9jb21w YXJlICgodHJlZSkgaGlnaF9ib3VuZC0+a2V5LAoJCQkJCSBoaWdoX3ZhbHVl KQoJCSAgIDw9IDApKQoJbm9kZSA9IGhpZ2hfYm91bmQ7CiAgICB9CiAgLyog SWYgdGhlcmUgd2FzIGFuIG92ZXJsYXAsIGlzc3VlIGFuIGVycm9yLiAgKi8K ICBpZiAobm9kZSkKICAgIHsKICAgICAgdHJlZSBkdXBsaWNhdGUgPSBDQVNF X0xBQkVMICgodHJlZSkgbm9kZS0+dmFsdWUpOwoKICAgICAgaWYgKGhpZ2hf dmFsdWUpCgl7CgkgIGVycm9yICgiZHVwbGljYXRlIChvciBvdmVybGFwcGlu ZykgY2FzZSB2YWx1ZSIpOwoJICBlcnJvciAoIiVKdGhpcyBpcyB0aGUgZmly c3QgZW50cnkgb3ZlcmxhcHBpbmcgdGhhdCB2YWx1ZSIsIGR1cGxpY2F0ZSk7 Cgl9CiAgICAgIGVsc2UgaWYgKGxvd192YWx1ZSkKCXsKCSAgZXJyb3IgKCJk dXBsaWNhdGUgY2FzZSB2YWx1ZSIpIDsKCSAgZXJyb3IgKCIlSnByZXZpb3Vz bHkgdXNlZCBoZXJlIiwgZHVwbGljYXRlKTsKCX0KICAgICAgZWxzZQoJewoJ ICBlcnJvciAoIm11bHRpcGxlIGRlZmF1bHQgbGFiZWxzIGluIG9uZSBzd2l0 Y2giKTsKCSAgZXJyb3IgKCIlSnRoaXMgaXMgdGhlIGZpcnN0IGRlZmF1bHQg bGFiZWwiLCBkdXBsaWNhdGUpOwoJfQogICAgICBnb3RvIGVycm9yX291dDsK ICAgIH0KCiAgLyogQWRkIGEgQ0FTRV9MQUJFTCB0byB0aGUgc3RhdGVtZW50 LXRyZWUuICAqLwogIGNhc2VfbGFiZWwgPSBhZGRfc3RtdCAoYnVpbGRfY2Fz ZV9sYWJlbCAobG93X3ZhbHVlLCBoaWdoX3ZhbHVlLCBsYWJlbCkpOwogIC8q IFJlZ2lzdGVyIHRoaXMgY2FzZSBsYWJlbCBpbiB0aGUgc3BsYXkgdHJlZS4g ICovCiAgc3BsYXlfdHJlZV9pbnNlcnQgKGNhc2VzLAoJCSAgICAgKHNwbGF5 X3RyZWVfa2V5KSBsb3dfdmFsdWUsCgkJICAgICAoc3BsYXlfdHJlZV92YWx1 ZSkgY2FzZV9sYWJlbCk7CgogIHJldHVybiBjYXNlX2xhYmVsOwoKIGVycm9y X291dDoKICAvKiBBZGQgYSBsYWJlbCBzbyB0aGF0IHRoZSBiYWNrLWVuZCBk b2Vzbid0IHRoaW5rIHRoYXQgdGhlIGJlZ2lubmluZyBvZgogICAgIHRoZSBz d2l0Y2ggaXMgdW5yZWFjaGFibGUuICBOb3RlIHRoYXQgd2UgZG8gbm90IGFk ZCBhIGNhc2UgbGFiZWwsIGFzCiAgICAgdGhhdCBqdXN0IGxlYWRzIHRvIGR1 cGxpY2F0ZXMgYW5kIHRoZW5jZSB0byBmYWlsdXJlIGxhdGVyIG9uLiAgKi8K ICBpZiAoIWNhc2VzLT5yb290KQogICAgewogICAgICB0cmVlIHQgPSBjcmVh dGVfYXJ0aWZpY2lhbF9sYWJlbCAoKTsKICAgICAgYWRkX3N0bXQgKGJ1aWxk X3N0bXQgKExBQkVMX0VYUFIsIHQpKTsKICAgIH0KICByZXR1cm4gZXJyb3Jf bWFya19ub2RlOwp9CgovKiBTdWJyb3V0aW5lcyBvZiBjX2RvX3N3aXRjaF93 YXJuaW5ncywgY2FsbGVkIHZpYSBzcGxheV90cmVlX2ZvcmVhY2guCiAgIFVz ZWQgdG8gdmVyaWZ5IHRoYXQgY2FzZSB2YWx1ZXMgbWF0Y2ggdXAgd2l0aCBl bnVtZXJhdG9yIHZhbHVlcy4gICovCgpzdGF0aWMgdm9pZAptYXRjaF9jYXNl X3RvX2VudW1fMSAodHJlZSBrZXksIHRyZWUgdHlwZSwgdHJlZSBsYWJlbCkK ewogIGNoYXIgYnVmWzIgKyAyKkhPU1RfQklUU19QRVJfV0lERV9JTlQvNCAr IDFdOwoKICAvKiA/Pz8gTm90IHdvcmtpbmcgdG9vIGhhcmQgdG8gcHJpbnQg dGhlIGRvdWJsZS13b3JkIHZhbHVlLgogICAgIFNob3VsZCBwZXJoYXBzIGJl IGRvbmUgd2l0aCAlbHdkIGluIHRoZSBkaWFnbm9zdGljIHJvdXRpbmVzPyAg Ki8KICBpZiAoVFJFRV9JTlRfQ1NUX0hJR0ggKGtleSkgPT0gMCkKICAgIHNu cHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgSE9TVF9XSURFX0lOVF9QUklO VF9VTlNJR05FRCwKCSAgICAgIFRSRUVfSU5UX0NTVF9MT1cgKGtleSkpOwog IGVsc2UgaWYgKCFUWVBFX1VOU0lHTkVEICh0eXBlKQoJICAgJiYgVFJFRV9J TlRfQ1NUX0hJR0ggKGtleSkgPT0gLTEKCSAgICYmIFRSRUVfSU5UX0NTVF9M T1cgKGtleSkgIT0gMCkKICAgIHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVm KSwgIi0iIEhPU1RfV0lERV9JTlRfUFJJTlRfVU5TSUdORUQsCgkgICAgICAt VFJFRV9JTlRfQ1NUX0xPVyAoa2V5KSk7CiAgZWxzZQogICAgc25wcmludGYg KGJ1Ziwgc2l6ZW9mIChidWYpLCBIT1NUX1dJREVfSU5UX1BSSU5UX0RPVUJM RV9IRVgsCgkgICAgICBUUkVFX0lOVF9DU1RfSElHSCAoa2V5KSwgVFJFRV9J TlRfQ1NUX0xPVyAoa2V5KSk7CgogIGlmIChUWVBFX05BTUUgKHR5cGUpID09 IDApCiAgICB3YXJuaW5nICgwLCAiJUpjYXNlIHZhbHVlICVxcyBub3QgaW4g ZW51bWVyYXRlZCB0eXBlIiwKCSAgICAgQ0FTRV9MQUJFTCAobGFiZWwpLCBi dWYpOwogIGVsc2UKICAgIHdhcm5pbmcgKDAsICIlSmNhc2UgdmFsdWUgJXFz IG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJXFUIiwKCSAgICAgQ0FTRV9MQUJF TCAobGFiZWwpLCBidWYsIHR5cGUpOwp9CgovKiBTdWJyb3V0aW5lIG9mIGNf ZG9fc3dpdGNoX3dhcm5pbmdzLCBjYWxsZWQgdmlhIHNwbGF5X3RyZWVfZm9y ZWFjaC4KICAgVXNlZCB0byB2ZXJpZnkgdGhhdCBjYXNlIHZhbHVlcyBtYXRj aCB1cCB3aXRoIGVudW1lcmF0b3IgdmFsdWVzLiAgKi8KCnN0YXRpYyBpbnQK bWF0Y2hfY2FzZV90b19lbnVtIChzcGxheV90cmVlX25vZGUgbm9kZSwgdm9p ZCAqZGF0YSkKewogIHRyZWUgbGFiZWwgPSAodHJlZSkgbm9kZS0+dmFsdWU7 CiAgdHJlZSB0eXBlID0gKHRyZWUpIGRhdGE7CgogIC8qIFNraXAgZGVmYXVs dCBjYXNlLiAgKi8KICBpZiAoIUNBU0VfTE9XIChsYWJlbCkpCiAgICByZXR1 cm4gMDsKCiAgLyogSWYgQ0FTRV9MT1dfU0VFTiBpcyBub3Qgc2V0LCB0aGF0 IG1lYW5zIENBU0VfTE9XIGRpZCBub3QgYXBwZWFyCiAgICAgd2hlbiB3ZSBk aWQgb3VyIGVudW0tPmNhc2Ugc2Nhbi4gIFJlc2V0IG91ciBzY3JhdGNoIGJp dCBhZnRlci4gICovCiAgaWYgKCFDQVNFX0xPV19TRUVOIChsYWJlbCkpCiAg ICBtYXRjaF9jYXNlX3RvX2VudW1fMSAoQ0FTRV9MT1cgKGxhYmVsKSwgdHlw ZSwgbGFiZWwpOwogIGVsc2UKICAgIENBU0VfTE9XX1NFRU4gKGxhYmVsKSA9 IDA7CgogIC8qIElmIENBU0VfSElHSCBpcyBub24tbnVsbCwgd2UgaGF2ZSBh IHJhbmdlLiAgSWYgQ0FTRV9ISUdIX1NFRU4gaXMKICAgICBub3Qgc2V0LCB0 aGF0IG1lYW5zIHRoYXQgQ0FTRV9ISUdIIGRpZCBub3QgYXBwZWFyIHdoZW4g d2UgZGlkIG91cgogICAgIGVudW0tPmNhc2Ugc2Nhbi4gIFJlc2V0IG91ciBz Y3JhdGNoIGJpdCBhZnRlci4gICovCiAgaWYgKENBU0VfSElHSCAobGFiZWwp KQogICAgewogICAgICBpZiAoIUNBU0VfSElHSF9TRUVOIChsYWJlbCkpCglt YXRjaF9jYXNlX3RvX2VudW1fMSAoQ0FTRV9ISUdIIChsYWJlbCksIHR5cGUs IGxhYmVsKTsKICAgICAgZWxzZQoJQ0FTRV9ISUdIX1NFRU4gKGxhYmVsKSA9 IDA7CiAgICB9CgogIHJldHVybiAwOwp9CgovKiBIYW5kbGUgLVdzd2l0Y2gq LiAgQ2FsbGVkIGZyb20gdGhlIGZyb250IGVuZCBhZnRlciBwYXJzaW5nIHRo ZQogICBzd2l0Y2ggY29uc3RydWN0LiAgKi8KLyogPz8/IFNob3VsZCBwcm9i YWJseSBiZSBzb21ld2hlcmUgZ2VuZXJpYywgc2luY2Ugb3RoZXIgbGFuZ3Vh Z2VzCiAgIGJlc2lkZXMgQyBhbmQgQysrIHdvdWxkIHdhbnQgdGhpcy4gIEF0 IHRoZSBtb21lbnQsIGhvd2V2ZXIsIEMvQysrCiAgIGFyZSB0aGUgb25seSB0 cmVlLXNzYSBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IGVudW1lcmF0aW9ucyBh dCBhbGwsCiAgIHNvIHRoZSBwb2ludCBpcyBtb290LiAgKi8KCnZvaWQKY19k b19zd2l0Y2hfd2FybmluZ3MgKHNwbGF5X3RyZWUgY2FzZXMsIGxvY2F0aW9u X3Qgc3dpdGNoX2xvY2F0aW9uLAoJCSAgICAgIHRyZWUgdHlwZSwgdHJlZSBj b25kKQp7CiAgc3BsYXlfdHJlZV9ub2RlIGRlZmF1bHRfbm9kZTsKICBzcGxh eV90cmVlX25vZGUgbm9kZTsKICB0cmVlIGNoYWluOwoKICBpZiAoIXdhcm5f c3dpdGNoICYmICF3YXJuX3N3aXRjaF9lbnVtICYmICF3YXJuX3N3aXRjaF9k ZWZhdWx0KQogICAgcmV0dXJuOwoKICBkZWZhdWx0X25vZGUgPSBzcGxheV90 cmVlX2xvb2t1cCAoY2FzZXMsIChzcGxheV90cmVlX2tleSkgTlVMTCk7CiAg aWYgKCFkZWZhdWx0X25vZGUpCiAgICB3YXJuaW5nIChPUFRfV3N3aXRjaF9k ZWZhdWx0LCAiJUhzd2l0Y2ggbWlzc2luZyBkZWZhdWx0IGNhc2UiLAoJICAg ICAmc3dpdGNoX2xvY2F0aW9uKTsKCiAgLyogRnJvbSBoZXJlIG9uLCB3ZSBv bmx5IGNhcmUgYWJvdXQgYWJvdXQgZW51bWVyYXRlZCB0eXBlcy4gICovCiAg aWYgKCF0eXBlIHx8IFRSRUVfQ09ERSAodHlwZSkgIT0gRU5VTUVSQUxfVFlQ RSkKICAgIHJldHVybjsKCiAgLyogSWYgdGhlIHN3aXRjaCBleHByZXNzaW9u IHdhcyBhbiBlbnVtZXJhdGVkIHR5cGUsIGNoZWNrIHRoYXQKICAgICBleGFj dGx5IGFsbCBlbnVtZXJhdGlvbiBsaXRlcmFscyBhcmUgY292ZXJlZCBieSB0 aGUgY2FzZXMuCiAgICAgVGhlIGNoZWNrIGlzIG1hZGUgd2hlbiAtV3N3aXRj aCB3YXMgc3BlY2lmaWVkIGFuZCB0aGVyZSBpcyBubwogICAgIGRlZmF1bHQg Y2FzZSwgb3Igd2hlbiAtV3N3aXRjaC1lbnVtIHdhcyBzcGVjaWZpZWQuICAq LwoKICBpZiAoIXdhcm5fc3dpdGNoX2VudW0KICAgICAgJiYgISh3YXJuX3N3 aXRjaCAmJiAhZGVmYXVsdF9ub2RlKSkKICAgIHJldHVybjsKCiAgLyogQ2xl YXJpbmcgQ09ORCBpZiBpdCBpcyBub3QgYW4gaW50ZWdlciBjb25zdGFudCBz aW1wbGlmaWVzCiAgICAgdGhlIHRlc3RzIGluc2lkZSB0aGUgbG9vcCBiZWxv dy4gICovCiAgaWYgKFRSRUVfQ09ERSAoY29uZCkgIT0gSU5URUdFUl9DU1Qp CiAgICBjb25kID0gTlVMTF9UUkVFOwoKICAvKiBUaGUgdGltZSBjb21wbGV4 aXR5IGhlcmUgaXMgTyhOKmxnKE4pKSB3b3JzdCBjYXNlLCBidXQgZm9yIHRo ZQogICAgICBjb21tb24gY2FzZSBvZiBtb25vdG9uaWNhbGx5IGluY3JlYXNp bmcgZW51bWVyYXRvcnMsIGl0IGlzCiAgICAgIE8oTiksIHNpbmNlIHRoZSBu YXR1cmUgb2YgdGhlIHNwbGF5IHRyZWUgd2lsbCBrZWVwIHRoZSBuZXh0CiAg ICAgIGVsZW1lbnQgYWRqYWNlbnQgdG8gdGhlIHJvb3QgYXQgYWxsIHRpbWVz LiAgKi8KCiAgZm9yIChjaGFpbiA9IFRZUEVfVkFMVUVTICh0eXBlKTsgY2hh aW47IGNoYWluID0gVFJFRV9DSEFJTiAoY2hhaW4pKQogICAgewogICAgICB0 cmVlIHZhbHVlID0gVFJFRV9WQUxVRSAoY2hhaW4pOwogICAgICBub2RlID0g c3BsYXlfdHJlZV9sb29rdXAgKGNhc2VzLCAoc3BsYXlfdHJlZV9rZXkpIHZh bHVlKTsKICAgICAgaWYgKG5vZGUpCgl7CgkgIC8qIE1hcmsgdGhlIENBU0Vf TE9XIHBhcnQgb2YgdGhlIGNhc2UgZW50cnkgYXMgc2Vlbi4gICovCgkgIHRy ZWUgbGFiZWwgPSAodHJlZSkgbm9kZS0+dmFsdWU7CgkgIENBU0VfTE9XX1NF RU4gKGxhYmVsKSA9IDE7CgkgIGNvbnRpbnVlOwoJfQoKICAgICAgLyogRXZl biB0aG91Z2ggdGhlcmUgd2Fzbid0IGFuIGV4YWN0IG1hdGNoLCB0aGVyZSBt aWdodCBiZSBhCgkgY2FzZSByYW5nZSB3aGljaCBpbmNsdWRlcyB0aGUgZW51 bWF0b3IncyB2YWx1ZS4gICovCiAgICAgIG5vZGUgPSBzcGxheV90cmVlX3By ZWRlY2Vzc29yIChjYXNlcywgKHNwbGF5X3RyZWVfa2V5KSB2YWx1ZSk7CiAg ICAgIGlmIChub2RlICYmIENBU0VfSElHSCAoKHRyZWUpIG5vZGUtPnZhbHVl KSkKCXsKCSAgdHJlZSBsYWJlbCA9ICh0cmVlKSBub2RlLT52YWx1ZTsKCSAg aW50IGNtcCA9IHRyZWVfaW50X2NzdF9jb21wYXJlIChDQVNFX0hJR0ggKGxh YmVsKSwgdmFsdWUpOwoJICBpZiAoY21wID49IDApCgkgICAgewoJICAgICAg LyogSWYgd2UgbWF0Y2ggdGhlIHVwcGVyIGJvdW5kIGV4YWN0bHksIG1hcmsg dGhlIENBU0VfSElHSAoJCSBwYXJ0IG9mIHRoZSBjYXNlIGVudHJ5IGFzIHNl ZW4uICAqLwoJICAgICAgaWYgKGNtcCA9PSAwKQoJCUNBU0VfSElHSF9TRUVO IChsYWJlbCkgPSAxOwoJICAgICAgY29udGludWU7CgkgICAgfQoJfQoKICAg ICAgLyogV2UndmUgbm93IGRldGVybWluZWQgdGhhdCB0aGlzIGVudW1lcmF0 ZWQgbGl0ZXJhbCBpc24ndAoJIGhhbmRsZWQgYnkgdGhlIGNhc2UgbGFiZWxz IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50LiAgKi8KCiAgICAgIC8qIElmIHRo ZSBzd2l0Y2ggZXhwcmVzc2lvbiBpcyBhIGNvbnN0YW50LCB3ZSBvbmx5IHJl YWxseSBjYXJlCgkgYWJvdXQgd2hldGhlciB0aGF0IGNvbnN0YW50IGlzIGhh bmRsZWQgYnkgdGhlIHN3aXRjaC4gICovCiAgICAgIGlmIChjb25kICYmIHRy ZWVfaW50X2NzdF9jb21wYXJlIChjb25kLCB2YWx1ZSkpCgljb250aW51ZTsK CiAgICAgIHdhcm5pbmcgKDAsICIlSGVudW1lcmF0aW9uIHZhbHVlICVxRSBu b3QgaGFuZGxlZCBpbiBzd2l0Y2giLAoJICAgICAgICZzd2l0Y2hfbG9jYXRp b24sIFRSRUVfUFVSUE9TRSAoY2hhaW4pKTsKICAgIH0KCiAgLyogV2FybiBp ZiB0aGVyZSBhcmUgY2FzZSBleHByZXNzaW9ucyB0aGF0IGRvbid0IGNvcnJl c3BvbmQgdG8KICAgICBlbnVtZXJhdG9ycy4gIFRoaXMgY2FuIG9jY3VyIHNp bmNlIEMgYW5kIEMrKyBkb24ndCBlbmZvcmNlCiAgICAgdHlwZS1jaGVja2lu ZyBvZiBhc3NpZ25tZW50cyB0byBlbnVtZXJhdGlvbiB2YXJpYWJsZXMuCgog ICAgIFRoZSB0aW1lIGNvbXBsZXhpdHkgaGVyZSBpcyBub3cgYWx3YXlzIE8o Tikgd29yc3QgY2FzZSwgc2luY2UKICAgICB3ZSBzaG91bGQgaGF2ZSBtYXJr ZWQgYm90aCB0aGUgbG93ZXIgYm91bmQgYW5kIHVwcGVyIGJvdW5kIG9mCiAg ICAgZXZlcnkgZGlzam9pbnQgY2FzZSBsYWJlbCwgd2l0aCBDQVNFX0xPV19T RUVOIGFuZCBDQVNFX0hJR0hfU0VFTgogICAgIGFib3ZlLiAgVGhpcyBzY2Fu IGFsc28gcmVzZXRzIHRob3NlIGZpZWxkcy4gICovCiAgc3BsYXlfdHJlZV9m b3JlYWNoIChjYXNlcywgbWF0Y2hfY2FzZV90b19lbnVtLCB0eXBlKTsKfQoK LyogRmluaXNoIGFuIGV4cHJlc3Npb24gdGFraW5nIHRoZSBhZGRyZXNzIG9m IExBQkVMIChhbgogICBJREVOVElGSUVSX05PREUpLiAgUmV0dXJucyBhbiBl eHByZXNzaW9uIGZvciB0aGUgYWRkcmVzcy4gICovCgp0cmVlCmZpbmlzaF9s YWJlbF9hZGRyZXNzX2V4cHIgKHRyZWUgbGFiZWwpCnsKICB0cmVlIHJlc3Vs dDsKCiAgaWYgKHBlZGFudGljKQogICAgcGVkd2FybiAoInRha2luZyB0aGUg YWRkcmVzcyBvZiBhIGxhYmVsIGlzIG5vbi1zdGFuZGFyZCIpOwoKICBpZiAo bGFiZWwgPT0gZXJyb3JfbWFya19ub2RlKQogICAgcmV0dXJuIGVycm9yX21h cmtfbm9kZTsKCiAgbGFiZWwgPSBsb29rdXBfbGFiZWwgKGxhYmVsKTsKICBp ZiAobGFiZWwgPT0gTlVMTF9UUkVFKQogICAgcmVzdWx0ID0gbnVsbF9wb2lu dGVyX25vZGU7CiAgZWxzZQogICAgewogICAgICBUUkVFX1VTRUQgKGxhYmVs KSA9IDE7CiAgICAgIHJlc3VsdCA9IGJ1aWxkMSAoQUREUl9FWFBSLCBwdHJf dHlwZV9ub2RlLCBsYWJlbCk7CiAgICAgIC8qIFRoZSBjdXJyZW50IGZ1bmN0 aW9uIGluIG5vdCBuZWNlc3NhcmlseSB1bmlubGluYWJsZS4KCSBDb21wdXRl ZCBnb3RvcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggaW5saW5pbmcsIGJ1dCB0 aGUgdmFsdWUKCSBoZXJlIGNvdWxkIGJlIHVzZWQgb25seSBpbiBhIGRpYWdu b3N0aWMsIGZvciBleGFtcGxlLiAgKi8KICAgIH0KCiAgcmV0dXJuIHJlc3Vs dDsKfQoKLyogSG9vayB1c2VkIGJ5IGV4cGFuZF9leHByIHRvIGV4cGFuZCBs YW5ndWFnZS1zcGVjaWZpYyB0cmVlIGNvZGVzLiAgKi8KLyogVGhlIG9ubHkg dGhpbmdzIHRoYXQgc2hvdWxkIGdvIGhlcmUgYXJlIGJpdHMgbmVlZGVkIHRv IGV4cGFuZAogICBjb25zdGFudCBpbml0aWFsaXplcnMuICBFdmVyeXRoaW5n IGVsc2Ugc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlCiAgIGdpbXBsaWZpY2F0 aW9uIHJvdXRpbmVzLiAgKi8KCnJ0eApjX2V4cGFuZF9leHByICh0cmVlIGV4 cCwgcnR4IHRhcmdldCwgZW51bSBtYWNoaW5lX21vZGUgdG1vZGUsCgkgICAg ICAgaW50IG1vZGlmaWVyIC8qIEFjdHVhbGx5IGVudW1fbW9kaWZpZXIuICAq LywKCSAgICAgICBydHggKmFsdF9ydGwpCnsKICBzd2l0Y2ggKFRSRUVfQ09E RSAoZXhwKSkKICAgIHsKICAgIGNhc2UgQ09NUE9VTkRfTElURVJBTF9FWFBS OgogICAgICB7CgkvKiBJbml0aWFsaXplIHRoZSBhbm9ueW1vdXMgdmFyaWFi bGUgZGVjbGFyZWQgaW4gdGhlIGNvbXBvdW5kCgkgICBsaXRlcmFsLCB0aGVu IHJldHVybiB0aGUgdmFyaWFibGUuICAqLwoJdHJlZSBkZWNsID0gQ09NUE9V TkRfTElURVJBTF9FWFBSX0RFQ0wgKGV4cCk7CgllbWl0X2xvY2FsX3ZhciAo ZGVjbCk7CglyZXR1cm4gZXhwYW5kX2V4cHJfcmVhbCAoZGVjbCwgdGFyZ2V0 LCB0bW9kZSwgbW9kaWZpZXIsIGFsdF9ydGwpOwogICAgICB9CgogICAgZGVm YXVsdDoKICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgfQp9CgovKiBI b29rIHVzZWQgYnkgc3RhdGljcCB0byBoYW5kbGUgbGFuZ3VhZ2Utc3BlY2lm aWMgdHJlZSBjb2Rlcy4gICovCgp0cmVlCmNfc3RhdGljcCAodHJlZSBleHAp CnsKICByZXR1cm4gKFRSRUVfQ09ERSAoZXhwKSA9PSBDT01QT1VORF9MSVRF UkFMX0VYUFIKCSAgJiYgVFJFRV9TVEFUSUMgKENPTVBPVU5EX0xJVEVSQUxf RVhQUl9ERUNMIChleHApKQoJICA/IGV4cCA6IE5VTEwpOwp9CgwKCi8qIEdp dmVuIGEgYm9vbGVhbiBleHByZXNzaW9uIEFSRywgcmV0dXJuIGEgdHJlZSBy ZXByZXNlbnRpbmcgYW4gaW5jcmVtZW50CiAgIG9yIGRlY3JlbWVudCAoYXMg aW5kaWNhdGVkIGJ5IENPREUpIG9mIEFSRy4gIFRoZSBmcm9udCBlbmQgbXVz dCBjaGVjayBmb3IKICAgaW52YWxpZCBjYXNlcyAoZS5nLiwgZGVjcmVtZW50 IGluIEMrKykuICAqLwp0cmVlCmJvb2xlYW5faW5jcmVtZW50IChlbnVtIHRy ZWVfY29kZSBjb2RlLCB0cmVlIGFyZykKewogIHRyZWUgdmFsOwogIHRyZWUg dHJ1ZV9yZXMgPSBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKGFyZyksIDEp OwoKICBhcmcgPSBzdGFiaWxpemVfcmVmZXJlbmNlIChhcmcpOwogIHN3aXRj aCAoY29kZSkKICAgIHsKICAgIGNhc2UgUFJFSU5DUkVNRU5UX0VYUFI6CiAg ICAgIHZhbCA9IGJ1aWxkMiAoTU9ESUZZX0VYUFIsIFRSRUVfVFlQRSAoYXJn KSwgYXJnLCB0cnVlX3Jlcyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBQT1NU SU5DUkVNRU5UX0VYUFI6CiAgICAgIHZhbCA9IGJ1aWxkMiAoTU9ESUZZX0VY UFIsIFRSRUVfVFlQRSAoYXJnKSwgYXJnLCB0cnVlX3Jlcyk7CiAgICAgIGFy ZyA9IHNhdmVfZXhwciAoYXJnKTsKICAgICAgdmFsID0gYnVpbGQyIChDT01Q T1VORF9FWFBSLCBUUkVFX1RZUEUgKGFyZyksIHZhbCwgYXJnKTsKICAgICAg dmFsID0gYnVpbGQyIChDT01QT1VORF9FWFBSLCBUUkVFX1RZUEUgKGFyZyks IGFyZywgdmFsKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFBSRURFQ1JFTUVO VF9FWFBSOgogICAgICB2YWwgPSBidWlsZDIgKE1PRElGWV9FWFBSLCBUUkVF X1RZUEUgKGFyZyksIGFyZywKCQkgICAgaW52ZXJ0X3RydXRodmFsdWUgKGFy ZykpOwogICAgICBicmVhazsKICAgIGNhc2UgUE9TVERFQ1JFTUVOVF9FWFBS OgogICAgICB2YWwgPSBidWlsZDIgKE1PRElGWV9FWFBSLCBUUkVFX1RZUEUg KGFyZyksIGFyZywKCQkgICAgaW52ZXJ0X3RydXRodmFsdWUgKGFyZykpOwog ICAgICBhcmcgPSBzYXZlX2V4cHIgKGFyZyk7CiAgICAgIHZhbCA9IGJ1aWxk MiAoQ09NUE9VTkRfRVhQUiwgVFJFRV9UWVBFIChhcmcpLCB2YWwsIGFyZyk7 CiAgICAgIHZhbCA9IGJ1aWxkMiAoQ09NUE9VTkRfRVhQUiwgVFJFRV9UWVBF IChhcmcpLCBhcmcsIHZhbCk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoK ICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgfQogIFRSRUVfU0lERV9F RkZFQ1RTICh2YWwpID0gMTsKICByZXR1cm4gdmFsOwp9CgwKLyogQnVpbHQt aW4gbWFjcm9zIGZvciBzdGRkZWYuaCwgdGhhdCByZXF1aXJlIG1hY3JvcyBk ZWZpbmVkIGluIHRoaXMKICAgZmlsZS4gICovCnZvaWQKY19zdGRkZWZfY3Bw X2J1aWx0aW5zKHZvaWQpCnsKICBidWlsdGluX2RlZmluZV93aXRoX3ZhbHVl ICgiX19TSVpFX1RZUEVfXyIsIFNJWkVfVFlQRSwgMCk7CiAgYnVpbHRpbl9k ZWZpbmVfd2l0aF92YWx1ZSAoIl9fUFRSRElGRl9UWVBFX18iLCBQVFJESUZG X1RZUEUsIDApOwogIGJ1aWx0aW5fZGVmaW5lX3dpdGhfdmFsdWUgKCJfX1dD SEFSX1RZUEVfXyIsIE1PRElGSUVEX1dDSEFSX1RZUEUsIDApOwogIGJ1aWx0 aW5fZGVmaW5lX3dpdGhfdmFsdWUgKCJfX1dJTlRfVFlQRV9fIiwgV0lOVF9U WVBFLCAwKTsKICBidWlsdGluX2RlZmluZV93aXRoX3ZhbHVlICgiX19JTlRN QVhfVFlQRV9fIiwgSU5UTUFYX1RZUEUsIDApOwogIGJ1aWx0aW5fZGVmaW5l X3dpdGhfdmFsdWUgKCJfX1VJTlRNQVhfVFlQRV9fIiwgVUlOVE1BWF9UWVBF LCAwKTsKfQoKc3RhdGljIHZvaWQKY19pbml0X2F0dHJpYnV0ZXMgKHZvaWQp CnsKICAvKiBGaWxsIGluIHRoZSBidWlsdF9pbl9hdHRyaWJ1dGVzIGFycmF5 LiAgKi8KI2RlZmluZSBERUZfQVRUUl9OVUxMX1RSRUUoRU5VTSkJCQkJXAog IGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkgRU5VTV0gPSBOVUxMX1RSRUU7 CiNkZWZpbmUgREVGX0FUVFJfSU5UKEVOVU0sIFZBTFVFKQkJCQlcCiAgYnVp bHRfaW5fYXR0cmlidXRlc1soaW50KSBFTlVNXSA9IGJ1aWxkX2ludF9jc3Qg KE5VTExfVFJFRSwgVkFMVUUpOwojZGVmaW5lIERFRl9BVFRSX0lERU5UKEVO VU0sIFNUUklORykJCQkJXAogIGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkg RU5VTV0gPSBnZXRfaWRlbnRpZmllciAoU1RSSU5HKTsKI2RlZmluZSBERUZf QVRUUl9UUkVFX0xJU1QoRU5VTSwgUFVSUE9TRSwgVkFMVUUsIENIQUlOKQlc CiAgYnVpbHRfaW5fYXR0cmlidXRlc1soaW50KSBFTlVNXQkJCVwKICAgID0g dHJlZV9jb25zIChidWlsdF9pbl9hdHRyaWJ1dGVzWyhpbnQpIFBVUlBPU0Vd LAlcCgkJIGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkgVkFMVUVdLAlcCgkJ IGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkgQ0hBSU5dKTsKI2luY2x1ZGUg ImJ1aWx0aW4tYXR0cnMuZGVmIgojdW5kZWYgREVGX0FUVFJfTlVMTF9UUkVF CiN1bmRlZiBERUZfQVRUUl9JTlQKI3VuZGVmIERFRl9BVFRSX0lERU5UCiN1 bmRlZiBERUZfQVRUUl9UUkVFX0xJU1QKfQoKLyogQXR0cmlidXRlIGhhbmRs ZXJzIGNvbW1vbiB0byBDIGZyb250IGVuZHMuICAqLwoKLyogSGFuZGxlIGEg InBhY2tlZCIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0 IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFu ZGxlX3BhY2tlZF9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwg dHJlZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkJIGludCBmbGFncywgYm9vbCAq bm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRZUEVfUCAoKm5vZGUpKQogICAgewog ICAgICBpZiAoIShmbGFncyAmIChpbnQpIEFUVFJfRkxBR19UWVBFX0lOX1BM QUNFKSkKCSpub2RlID0gYnVpbGRfdmFyaWFudF90eXBlX2NvcHkgKCpub2Rl KTsKICAgICAgVFlQRV9QQUNLRUQgKCpub2RlKSA9IDE7CiAgICB9CiAgZWxz ZSBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRklFTERfREVDTCkKICAgIHsK ICAgICAgaWYgKFRZUEVfQUxJR04gKFRSRUVfVFlQRSAoKm5vZGUpKSA8PSBC SVRTX1BFUl9VTklUKQoJd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLAoJCSAi JXFFIGF0dHJpYnV0ZSBpZ25vcmVkIGZvciBmaWVsZCBvZiB0eXBlICVxVCIs CgkJIG5hbWUsIFRSRUVfVFlQRSAoKm5vZGUpKTsKICAgICAgZWxzZQoJREVD TF9QQUNLRUQgKCpub2RlKSA9IDE7CiAgICB9CiAgLyogV2UgY2FuJ3Qgc2V0 IERFQ0xfUEFDS0VEIGZvciBhIFZBUl9ERUNMLCBiZWNhdXNlIHRoZSBiaXQg aXMKICAgICB1c2VkIGZvciBERUNMX1JFR0lTVEVSLiAgSXQgd291bGRuJ3Qg bWVhbiBhbnl0aGluZyBhbnl3YXkuCiAgICAgV2UgY2FuJ3Qgc2V0IERFQ0xf UEFDS0VEIG9uIHRoZSB0eXBlIG9mIGEgVFlQRV9ERUNMLCBiZWNhdXNlCiAg ICAgdGhhdCBjaGFuZ2VzIHdoYXQgdGhlIHR5cGVkZWYgaXMgdHlwaW5nLiAg Ki8KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgIm5vY29tbW9uIiBhdHRyaWJ1dGU7IGFyZ3VtZW50 cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICov CgpzdGF0aWMgdHJlZQpoYW5kbGVfbm9jb21tb25fYXR0cmlidXRlICh0cmVl ICpub2RlLCB0cmVlIG5hbWUsCgkJCSAgIHRyZWUgQVJHX1VOVVNFRCAoYXJn cyksCgkJCSAgIGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2Fk ZF9hdHRycykKewogIGlmIChUUkVFX0NPREUgKCpub2RlKSA9PSBWQVJfREVD TCkKICAgIERFQ0xfQ09NTU9OICgqbm9kZSkgPSAwOwogIGVsc2UKICAgIHsK ICAgICAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0 ZSBpZ25vcmVkIiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVl OwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAi Y29tbW9uIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3Qg YXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5k bGVfY29tbW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0 cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkgaW50IEFSR19VTlVTRUQgKGZs YWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAo Km5vZGUpID09IFZBUl9ERUNMKQogICAgREVDTF9DT01NT04gKCpub2RlKSA9 IDE7CiAgZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0 ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5v X2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7 Cn0KCi8qIEhhbmRsZSBhICJub3JldHVybiIgYXR0cmlidXRlOyBhcmd1bWVu dHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAq LwoKc3RhdGljIHRyZWUKaGFuZGxlX25vcmV0dXJuX2F0dHJpYnV0ZSAodHJl ZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJ CQkgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLCBib29sICpub19hZGRfYXR0 cnMpCnsKICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKCpub2RlKTsKCiAgLyog U2VlIEZJWE1FIGNvbW1lbnQgaW4gY19jb21tb25fYXR0cmlidXRlX3RhYmxl LiAgKi8KICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVD TCkKICAgIFRSRUVfVEhJU19WT0xBVElMRSAoKm5vZGUpID0gMTsKICBlbHNl IGlmIChUUkVFX0NPREUgKHR5cGUpID09IFBPSU5URVJfVFlQRQoJICAgJiYg VFJFRV9DT0RFIChUUkVFX1RZUEUgKHR5cGUpKSA9PSBGVU5DVElPTl9UWVBF KQogICAgVFJFRV9UWVBFICgqbm9kZSkKICAgICAgPSBidWlsZF9wb2ludGVy X3R5cGUKCShidWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAodHlwZSks CgkJCSAgICAgVFlQRV9SRUFET05MWSAoVFJFRV9UWVBFICh0eXBlKSksIDEp KTsKICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgImhvdCIgYW5kIGF0dHJpYnV0ZTsgYXJndW1lbnRz IGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8K CnN0YXRpYyB0cmVlCmhhbmRsZV9ob3RfYXR0cmlidXRlICh0cmVlICpub2Rl LCB0cmVlIG5hbWUsIHRyZWUgQVJHX1VOVVNFRCAoYXJncyksCgkJCSAgaW50 IEFSR19VTlVTRUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAg aWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICB7 CiAgICAgIGlmIChsb29rdXBfYXR0cmlidXRlICgiY29sZCIsIERFQ0xfQVRU UklCVVRFUyAoKm5vZGUpKSAhPSBOVUxMKQoJewoJICB3YXJuaW5nIChPUFRf V2F0dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGNvbmZsaWN0cyB3aXRoIGF0 dHJpYnV0ZSAlcyIsCgkJICAgbmFtZSwgImNvbGQiKTsKCSAgKm5vX2FkZF9h dHRycyA9IHRydWU7Cgl9CiAgICAgIC8qIERvIG5vdGhpbmcgZWxzZSwganVz dCBzZXQgdGhlIGF0dHJpYnV0ZS4gIFdlJ2xsIGdldCBhdAoJIGl0IGxhdGVy IHdpdGggbG9va3VwX2F0dHJpYnV0ZS4gICovCiAgICB9CiAgZWxzZQogICAg ewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmli dXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRy dWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KLyogSGFuZGxlIGEg ImNvbGQiIGFuZCBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1 Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpo YW5kbGVfY29sZF9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwg dHJlZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkgICAgICAgaW50IEFSR19VTlVT RUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVf Q09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICB7CiAgICAgIGlm IChsb29rdXBfYXR0cmlidXRlICgiaG90IiwgREVDTF9BVFRSSUJVVEVTICgq bm9kZSkpICE9IE5VTEwpCgl7CgkgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgY29uZmxpY3RzIHdpdGggYXR0cmlidXRlICVz IiwKCQkgICBuYW1lLCAiaG90Iik7CgkgICpub19hZGRfYXR0cnMgPSB0cnVl OwoJfQogICAgICAvKiBEbyBub3RoaW5nIGVsc2UsIGp1c3Qgc2V0IHRoZSBh dHRyaWJ1dGUuICBXZSdsbCBnZXQgYXQKCSBpdCBsYXRlciB3aXRoIGxvb2t1 cF9hdHRyaWJ1dGUuICAqLwogICAgfQogIGVsc2UKICAgIHsKICAgICAgd2Fy bmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVk IiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoK ICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAibm9pbmxpbmUi IGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1 dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9ub2lu bGluZV9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkJICAg dHJlZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkJICAgaW50IEFSR19VTlVTRUQg KGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09E RSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICBERUNMX1VOSU5MSU5B QkxFICgqbm9kZSkgPSAxOwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAo T1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFt ZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1 cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAiYWx3YXlzX2lubGluZSIg YXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0 ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX2Fsd2F5 c19pbmxpbmVfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJ CQl0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkJaW50IEFSR19VTlVTRUQg KGZsYWdzKSwKCQkJCWJvb2wgKm5vX2FkZF9hdHRycykKewogIGlmIChUUkVF X0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKQogICAgewogICAgICAv KiBTZXQgdGhlIGF0dHJpYnV0ZSBhbmQgbWFyayBpdCBmb3IgZGlzcmVnYXJk aW5nIGlubGluZQoJIGxpbWl0cy4gICovCiAgICAgIERFQ0xfRElTUkVHQVJE X0lOTElORV9MSU1JVFMgKCpub2RlKSA9IDE7CiAgICB9CiAgZWxzZQogICAg ewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmli dXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRy dWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBh ICJnbnVfaW5saW5lIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBz dHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJl ZQpoYW5kbGVfZ251X2lubGluZV9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRy ZWUgbmFtZSwKCQkJICAgICB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkg ICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksCgkJCSAgICAgYm9vbCAqbm9f YWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNU SU9OX0RFQ0wgJiYgREVDTF9ERUNMQVJFRF9JTkxJTkVfUCAoKm5vZGUpKQog ICAgewogICAgICAvKiBEbyBub3RoaW5nIGVsc2UsIGp1c3Qgc2V0IHRoZSBh dHRyaWJ1dGUuICBXZSdsbCBnZXQgYXQKCSBpdCBsYXRlciB3aXRoIGxvb2t1 cF9hdHRyaWJ1dGUuICAqLwogICAgfQogIGVsc2UKICAgIHsKICAgICAgd2Fy bmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVk IiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoK ICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYW4gImFydGlmaWNp YWwiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRy aWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9h cnRpZmljaWFsX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLAoJ CQkgICAgIHRyZWUgQVJHX1VOVVNFRCAoYXJncyksCgkJCSAgICAgaW50IEFS R19VTlVTRUQgKGZsYWdzKSwKCQkJICAgICBib29sICpub19hZGRfYXR0cnMp CnsKICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVDTCAm JiBERUNMX0RFQ0xBUkVEX0lOTElORV9QICgqbm9kZSkpCiAgICB7CiAgICAg IC8qIERvIG5vdGhpbmcgZWxzZSwganVzdCBzZXQgdGhlIGF0dHJpYnV0ZS4g IFdlJ2xsIGdldCBhdAoJIGl0IGxhdGVyIHdpdGggbG9va3VwX2F0dHJpYnV0 ZS4gICovCiAgICB9CiAgZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRf V2F0dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsK ICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBO VUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJmbGF0dGVuIiBhdHRyaWJ1dGU7 IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFu ZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfZmxhdHRlbl9hdHRyaWJ1 dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkJICB0cmVlIGFyZ3MgQVRU UklCVVRFX1VOVVNFRCwKCQkJICBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNF RCwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAoKm5v ZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICAvKiBEbyBub3RoaW5nIGVsc2Us IGp1c3Qgc2V0IHRoZSBhdHRyaWJ1dGUuICBXZSdsbCBnZXQgYXQKICAgICAg IGl0IGxhdGVyIHdpdGggbG9va3VwX2F0dHJpYnV0ZS4gICovCiAgICA7CiAg ZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIl cUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9h dHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8q IEhhbmRsZSBhICJ3YXJuaW5nIiBvciAiZXJyb3IiIGF0dHJpYnV0ZTsgYXJn dW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVy LiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9lcnJvcl9hdHRyaWJ1dGUgKHRy ZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzLAoJCQlpbnQgQVJHX1VO VVNFRCAoZmxhZ3MpLCBib29sICpub19hZGRfYXR0cnMpCnsKICBpZiAoVFJF RV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVDTAogICAgICB8fCBUUkVF X0NPREUgKFRSRUVfVkFMVUUgKGFyZ3MpKSA9PSBTVFJJTkdfQ1NUKQogICAg LyogRG8gbm90aGluZyBlbHNlLCBqdXN0IHNldCB0aGUgYXR0cmlidXRlLiAg V2UnbGwgZ2V0IGF0CiAgICAgICBpdCBsYXRlciB3aXRoIGxvb2t1cF9hdHRy aWJ1dGUuICAqLwogICAgOwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAo T1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFt ZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1 cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAidXNlZCIgYXR0cmlidXRl OyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhh bmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX3VzZWRfYXR0cmlidXRl ICh0cmVlICpwbm9kZSwgdHJlZSBuYW1lLCB0cmVlIEFSR19VTlVTRUQgKGFy Z3MpLAoJCSAgICAgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLCBib29sICpu b19hZGRfYXR0cnMpCnsKICB0cmVlIG5vZGUgPSAqcG5vZGU7CgogIGlmIChU UkVFX0NPREUgKG5vZGUpID09IEZVTkNUSU9OX0RFQ0wKICAgICAgfHwgKFRS RUVfQ09ERSAobm9kZSkgPT0gVkFSX0RFQ0wgJiYgVFJFRV9TVEFUSUMgKG5v ZGUpKSkKICAgIHsKICAgICAgVFJFRV9VU0VEIChub2RlKSA9IDE7CiAgICAg IERFQ0xfUFJFU0VSVkVfUCAobm9kZSkgPSAxOwogICAgfQogIGVsc2UKICAg IHsKICAgICAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJp YnV0ZSBpZ25vcmVkIiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0 cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUg YSAidW51c2VkIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1 Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpo YW5kbGVfdW51c2VkX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1l LCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkgaW50IGZsYWdzLCBib29s ICpub19hZGRfYXR0cnMpCnsKICBpZiAoREVDTF9QICgqbm9kZSkpCiAgICB7 CiAgICAgIHRyZWUgZGVjbCA9ICpub2RlOwoKICAgICAgaWYgKFRSRUVfQ09E RSAoZGVjbCkgPT0gUEFSTV9ERUNMCgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkg PT0gVkFSX0RFQ0wKCSAgfHwgVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElP Tl9ERUNMCgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gTEFCRUxfREVDTAoJ ICB8fCBUUkVFX0NPREUgKGRlY2wpID09IFRZUEVfREVDTCkKCVRSRUVfVVNF RCAoZGVjbCkgPSAxOwogICAgICBlbHNlCgl7CgkgIHdhcm5pbmcgKE9QVF9X YXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwoJ ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCX0KICAgIH0KICBlbHNlCiAgICB7 CiAgICAgIGlmICghKGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZUEVfSU5f UExBQ0UpKQoJKm5vZGUgPSBidWlsZF92YXJpYW50X3R5cGVfY29weSAoKm5v ZGUpOwogICAgICBUUkVFX1VTRUQgKCpub2RlKSA9IDE7CiAgICB9CgogIHJl dHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJleHRlcm5hbGx5X3Zp c2libGUiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBh dHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRs ZV9leHRlcm5hbGx5X3Zpc2libGVfYXR0cmlidXRlICh0cmVlICpwbm9kZSwg dHJlZSBuYW1lLAoJCQkJICAgICB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJ CQkJICAgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkJICAgICBib29s ICpub19hZGRfYXR0cnMpCnsKICB0cmVlIG5vZGUgPSAqcG5vZGU7CgogIGlm IChUUkVFX0NPREUgKG5vZGUpID09IEZVTkNUSU9OX0RFQ0wgfHwgVFJFRV9D T0RFIChub2RlKSA9PSBWQVJfREVDTCkKICAgIHsKICAgICAgaWYgKCghVFJF RV9TVEFUSUMgKG5vZGUpICYmIFRSRUVfQ09ERSAobm9kZSkgIT0gRlVOQ1RJ T05fREVDTAoJICAgJiYgIURFQ0xfRVhURVJOQUwgKG5vZGUpKSB8fCAhVFJF RV9QVUJMSUMgKG5vZGUpKQoJewoJICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0 ZXMsCgkJICAgIiVxRSBhdHRyaWJ1dGUgaGF2ZSBlZmZlY3Qgb25seSBvbiBw dWJsaWMgb2JqZWN0cyIsIG5hbWUpOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1 ZTsKCX0KICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9X YXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwog ICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5V TExfVFJFRTsKfQoKLyogSGFuZGxlIGEgImNvbnN0IiBhdHRyaWJ1dGU7IGFy Z3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxl ci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfY29uc3RfYXR0cmlidXRlICh0 cmVlICpub2RlLCB0cmVlIG5hbWUsIHRyZWUgQVJHX1VOVVNFRCAoYXJncyks CgkJCWludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRy cykKewogIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoKm5vZGUpOwoKICAvKiBT ZWUgRklYTUUgY29tbWVudCBvbiBub3JldHVybiBpbiBjX2NvbW1vbl9hdHRy aWJ1dGVfdGFibGUuICAqLwogIGlmIChUUkVFX0NPREUgKCpub2RlKSA9PSBG VU5DVElPTl9ERUNMKQogICAgVFJFRV9SRUFET05MWSAoKm5vZGUpID0gMTsK ICBlbHNlIGlmIChUUkVFX0NPREUgKHR5cGUpID09IFBPSU5URVJfVFlQRQoJ ICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKHR5cGUpKSA9PSBGVU5DVElP Tl9UWVBFKQogICAgVFJFRV9UWVBFICgqbm9kZSkKICAgICAgPSBidWlsZF9w b2ludGVyX3R5cGUKCShidWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAo dHlwZSksIDEsCgkJCSAgICAgVFJFRV9USElTX1ZPTEFUSUxFIChUUkVFX1RZ UEUgKHR5cGUpKSkpOwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAoT1BU X1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFtZSk7 CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4g TlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAidHJhbnNwYXJlbnRfdW5pb24i IGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1 dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV90cmFu c3BhcmVudF91bmlvbl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFt ZSwKCQkJCSAgICB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLCBpbnQgZmxhZ3Ms CgkJCQkgICAgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSB0eXBlOwoK ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCiAgaWYgKFRSRUVfQ09ERSAoKm5v ZGUpID09IFRZUEVfREVDTCkKICAgIG5vZGUgPSAmVFJFRV9UWVBFICgqbm9k ZSk7CiAgdHlwZSA9ICpub2RlOwoKICBpZiAoVFJFRV9DT0RFICh0eXBlKSA9 PSBVTklPTl9UWVBFKQogICAgewogICAgICAvKiBXaGVuIElOX1BMQUNFIGlz IHNldCwgbGVhdmUgdGhlIGNoZWNrIGZvciBGSUVMRFMgYW5kIE1PREUgdG8K CSB0aGUgY29kZSBpbiBmaW5pc2hfc3RydWN0LiAgKi8KICAgICAgaWYgKCEo ZmxhZ3MgJiAoaW50KSBBVFRSX0ZMQUdfVFlQRV9JTl9QTEFDRSkpCgl7Cgkg IGlmIChUWVBFX0ZJRUxEUyAodHlwZSkgPT0gTlVMTF9UUkVFCgkgICAgICB8 fCBUWVBFX01PREUgKHR5cGUpICE9IERFQ0xfTU9ERSAoVFlQRV9GSUVMRFMg KHR5cGUpKSkKCSAgICBnb3RvIGlnbm9yZWQ7CgoJICAvKiBBIHR5cGUgdmFy aWFudCBpc24ndCBnb29kIGVub3VnaCwgc2luY2Ugd2UgZG9uJ3QgYSBjYXN0 CgkgICAgIHRvIHN1Y2ggYSB0eXBlIHJlbW92ZWQgYXMgYSBuby1vcC4gICov CgkgICpub2RlID0gdHlwZSA9IGJ1aWxkX2R1cGxpY2F0ZV90eXBlICh0eXBl KTsKCX0KCiAgICAgIFRZUEVfVFJBTlNQQVJFTlRfVU5JT04gKHR5cGUpID0g MTsKICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiBpZ25vcmVkOgog IHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdu b3JlZCIsIG5hbWUpOwogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIFN1YnJv dXRpbmUgb2YgaGFuZGxlX3tjb24sZGV9c3RydWN0b3JfYXR0cmlidXRlLiAg RXZhbHVhdGUgQVJHUyB0bwogICBnZXQgdGhlIHJlcXVlc3RlZCBwcmlvcml0 eSBmb3IgYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLAogICBwb3NzaWJs eSBpc3N1aW5nIGRpYWdub3N0aWNzIGZvciBpbnZhbGlkIG9yIHJlc2VydmVk CiAgIHByaW9yaXRpZXMuICAqLwoKc3RhdGljIHByaW9yaXR5X3R5cGUKZ2V0 X3ByaW9yaXR5ICh0cmVlIGFyZ3MsIGJvb2wgaXNfZGVzdHJ1Y3RvcikKewog IEhPU1RfV0lERV9JTlQgcHJpOwogIHRyZWUgYXJnOwoKICBpZiAoIWFyZ3Mp CiAgICByZXR1cm4gREVGQVVMVF9JTklUX1BSSU9SSVRZOwogIAogIGlmICgh U1VQUE9SVFNfSU5JVF9QUklPUklUWSkKICAgIHsKICAgICAgaWYgKGlzX2Rl c3RydWN0b3IpCgllcnJvciAoImRlc3RydWN0b3IgcHJpb3JpdGllcyBhcmUg bm90IHN1cHBvcnRlZCIpOwogICAgICBlbHNlCgllcnJvciAoImNvbnN0cnVj dG9yIHByaW9yaXRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgcmV0 dXJuIERFRkFVTFRfSU5JVF9QUklPUklUWTsKICAgIH0KCiAgYXJnID0gVFJF RV9WQUxVRSAoYXJncyk7CiAgaWYgKCFob3N0X2ludGVnZXJwIChhcmcsIC8q cG9zPSovMCkKICAgICAgfHwgIUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBF IChhcmcpKSkKICAgIGdvdG8gaW52YWxpZDsKCiAgcHJpID0gdHJlZV9sb3df Y3N0IChUUkVFX1ZBTFVFIChhcmdzKSwgLypwb3M9Ki8wKTsKICBpZiAocHJp IDwgMCB8fCBwcmkgPiBNQVhfSU5JVF9QUklPUklUWSkKICAgIGdvdG8gaW52 YWxpZDsKCiAgaWYgKHByaSA8PSBNQVhfUkVTRVJWRURfSU5JVF9QUklPUklU WSkKICAgIHsKICAgICAgaWYgKGlzX2Rlc3RydWN0b3IpCgl3YXJuaW5nICgw LAoJCSAiZGVzdHJ1Y3RvciBwcmlvcml0aWVzIGZyb20gMCB0byAlZCBhcmUg cmVzZXJ2ZWQgIgoJCSAiZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiIsIAoJCSBN QVhfUkVTRVJWRURfSU5JVF9QUklPUklUWSk7CiAgICAgIGVsc2UKCXdhcm5p bmcgKDAsCgkJICJjb25zdHJ1Y3RvciBwcmlvcml0aWVzIGZyb20gMCB0byAl ZCBhcmUgcmVzZXJ2ZWQgIgoJCSAiZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiIs IAoJCSBNQVhfUkVTRVJWRURfSU5JVF9QUklPUklUWSk7CiAgICB9CiAgcmV0 dXJuIHByaTsKCiBpbnZhbGlkOgogIGlmIChpc19kZXN0cnVjdG9yKQogICAg ZXJyb3IgKCJkZXN0cnVjdG9yIHByaW9yaXRpZXMgbXVzdCBiZSBpbnRlZ2Vy cyBmcm9tIDAgdG8gJWQgaW5jbHVzaXZlIiwKCSAgIE1BWF9JTklUX1BSSU9S SVRZKTsKICBlbHNlCiAgICBlcnJvciAoImNvbnN0cnVjdG9yIHByaW9yaXRp ZXMgbXVzdCBiZSBpbnRlZ2VycyBmcm9tIDAgdG8gJWQgaW5jbHVzaXZlIiwK CSAgIE1BWF9JTklUX1BSSU9SSVRZKTsKICByZXR1cm4gREVGQVVMVF9JTklU X1BSSU9SSVRZOwp9CgovKiBIYW5kbGUgYSAiY29uc3RydWN0b3IiIGF0dHJp YnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3Bl Yy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9jb25zdHJ1Y3Rv cl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdz LAoJCQkgICAgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkgICAgICBi b29sICpub19hZGRfYXR0cnMpCnsKICB0cmVlIGRlY2wgPSAqbm9kZTsKICB0 cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGRlY2wpOwoKICBpZiAoVFJFRV9DT0RF IChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCiAgICAgICYmIFRSRUVfQ09ERSAo dHlwZSkgPT0gRlVOQ1RJT05fVFlQRQogICAgICAmJiBkZWNsX2Z1bmN0aW9u X2NvbnRleHQgKGRlY2wpID09IDApCiAgICB7CiAgICAgIHByaW9yaXR5X3R5 cGUgcHJpb3JpdHk7CiAgICAgIERFQ0xfU1RBVElDX0NPTlNUUlVDVE9SIChk ZWNsKSA9IDE7CiAgICAgIHByaW9yaXR5ID0gZ2V0X3ByaW9yaXR5IChhcmdz LCAvKmlzX2Rlc3RydWN0b3I9Ki9mYWxzZSk7CiAgICAgIFNFVF9ERUNMX0lO SVRfUFJJT1JJVFkgKGRlY2wsIHByaW9yaXR5KTsKICAgICAgVFJFRV9VU0VE IChkZWNsKSA9IDE7CiAgICB9CiAgZWxzZQogICAgewogICAgICB3YXJuaW5n IChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBu YW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJl dHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJkZXN0cnVjdG9yIiBh dHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRl X3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfZGVzdHJ1 Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBh cmdzLAoJCQkgICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksCgkJCSAgICAg Ym9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CiAg dHJlZSB0eXBlID0gVFJFRV9UWVBFIChkZWNsKTsKCiAgaWYgKFRSRUVfQ09E RSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTAogICAgICAmJiBUUkVFX0NPREUg KHR5cGUpID09IEZVTkNUSU9OX1RZUEUKICAgICAgJiYgZGVjbF9mdW5jdGlv bl9jb250ZXh0IChkZWNsKSA9PSAwKQogICAgewogICAgICBwcmlvcml0eV90 eXBlIHByaW9yaXR5OwogICAgICBERUNMX1NUQVRJQ19ERVNUUlVDVE9SIChk ZWNsKSA9IDE7CiAgICAgIHByaW9yaXR5ID0gZ2V0X3ByaW9yaXR5IChhcmdz LCAvKmlzX2Rlc3RydWN0b3I9Ki90cnVlKTsKICAgICAgU0VUX0RFQ0xfRklO SV9QUklPUklUWSAoZGVjbCwgcHJpb3JpdHkpOwogICAgICBUUkVFX1VTRUQg KGRlY2wpID0gMTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcg KE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5h bWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0 dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm1vZGUiIGF0dHJpYnV0 ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5o YW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9tb2RlX2F0dHJpYnV0 ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MsCgkJICAgICAg IGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykK ewogIHRyZWUgdHlwZSA9ICpub2RlOwoKICAqbm9fYWRkX2F0dHJzID0gdHJ1 ZTsKCiAgaWYgKFRSRUVfQ09ERSAoVFJFRV9WQUxVRSAoYXJncykpICE9IElE RU5USUZJRVJfTk9ERSkKICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywg IiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogIGVsc2UKICAgIHsK ICAgICAgaW50IGo7CiAgICAgIGNvbnN0IGNoYXIgKnAgPSBJREVOVElGSUVS X1BPSU5URVIgKFRSRUVfVkFMVUUgKGFyZ3MpKTsKICAgICAgaW50IGxlbiA9 IHN0cmxlbiAocCk7CiAgICAgIGVudW0gbWFjaGluZV9tb2RlIG1vZGUgPSBW T0lEbW9kZTsKICAgICAgdHJlZSB0eXBlZm07CiAgICAgIGJvb2wgdmFsaWRf bW9kZTsKCiAgICAgIGlmIChsZW4gPiA0ICYmIHBbMF0gPT0gJ18nICYmIHBb MV0gPT0gJ18nCgkgICYmIHBbbGVuIC0gMV0gPT0gJ18nICYmIHBbbGVuIC0g Ml0gPT0gJ18nKQoJewoJICBjaGFyICpuZXdwID0gKGNoYXIgKikgYWxsb2Nh IChsZW4gLSAxKTsKCgkgIHN0cmNweSAobmV3cCwgJnBbMl0pOwoJICBuZXdw W2xlbiAtIDRdID0gJ1wwJzsKCSAgcCA9IG5ld3A7Cgl9CgogICAgICAvKiBD aGFuZ2UgdGhpcyB0eXBlIHRvIGhhdmUgYSB0eXBlIHdpdGggdGhlIHNwZWNp ZmllZCBtb2RlLgoJIEZpcnN0IGNoZWNrIGZvciB0aGUgc3BlY2lhbCBtb2Rl cy4gICovCiAgICAgIGlmICghc3RyY21wIChwLCAiYnl0ZSIpKQoJbW9kZSA9 IGJ5dGVfbW9kZTsKICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocCwgIndvcmQi KSkKCW1vZGUgPSB3b3JkX21vZGU7CiAgICAgIGVsc2UgaWYgKCFzdHJjbXAg KHAsICJwb2ludGVyIikpCgltb2RlID0gcHRyX21vZGU7CiAgICAgIGVsc2Ug aWYgKCFzdHJjbXAgKHAsICJsaWJnY2NfY21wX3JldHVybiIpKQoJbW9kZSA9 IHRhcmdldG0ubGliZ2NjX2NtcF9yZXR1cm5fbW9kZSAoKTsKICAgICAgZWxz ZSBpZiAoIXN0cmNtcCAocCwgImxpYmdjY19zaGlmdF9jb3VudCIpKQoJbW9k ZSA9IHRhcmdldG0ubGliZ2NjX3NoaWZ0X2NvdW50X21vZGUgKCk7CiAgICAg IGVsc2UKCWZvciAoaiA9IDA7IGogPCBOVU1fTUFDSElORV9NT0RFUzsgaisr KQoJICBpZiAoIXN0cmNtcCAocCwgR0VUX01PREVfTkFNRSAoaikpKQoJICAg IHsKCSAgICAgIG1vZGUgPSAoZW51bSBtYWNoaW5lX21vZGUpIGo7CgkgICAg ICBicmVhazsKCSAgICB9CgogICAgICBpZiAobW9kZSA9PSBWT0lEbW9kZSkK CXsKCSAgZXJyb3IgKCJ1bmtub3duIG1hY2hpbmUgbW9kZSAlcXMiLCBwKTsK CSAgcmV0dXJuIE5VTExfVFJFRTsKCX0KCiAgICAgIHZhbGlkX21vZGUgPSBm YWxzZTsKICAgICAgc3dpdGNoIChHRVRfTU9ERV9DTEFTUyAobW9kZSkpCgl7 CgljYXNlIE1PREVfSU5UOgoJY2FzZSBNT0RFX1BBUlRJQUxfSU5UOgoJY2Fz ZSBNT0RFX0ZMT0FUOgoJY2FzZSBNT0RFX0RFQ0lNQUxfRkxPQVQ6CgljYXNl IE1PREVfRlJBQ1Q6CgljYXNlIE1PREVfVUZSQUNUOgoJY2FzZSBNT0RFX0FD Q1VNOgoJY2FzZSBNT0RFX1VBQ0NVTToKCSAgdmFsaWRfbW9kZSA9IHRhcmdl dG0uc2NhbGFyX21vZGVfc3VwcG9ydGVkX3AgKG1vZGUpOwoJICBicmVhazsK CgljYXNlIE1PREVfQ09NUExFWF9JTlQ6CgljYXNlIE1PREVfQ09NUExFWF9G TE9BVDoKCSAgdmFsaWRfbW9kZSA9IHRhcmdldG0uc2NhbGFyX21vZGVfc3Vw cG9ydGVkX3AgKEdFVF9NT0RFX0lOTkVSIChtb2RlKSk7CgkgIGJyZWFrOwoK CWNhc2UgTU9ERV9WRUNUT1JfSU5UOgoJY2FzZSBNT0RFX1ZFQ1RPUl9GTE9B VDoKCWNhc2UgTU9ERV9WRUNUT1JfRlJBQ1Q6CgljYXNlIE1PREVfVkVDVE9S X1VGUkFDVDoKCWNhc2UgTU9ERV9WRUNUT1JfQUNDVU06CgljYXNlIE1PREVf VkVDVE9SX1VBQ0NVTToKCSAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAi c3BlY2lmeWluZyB2ZWN0b3IgdHlwZXMgd2l0aCAiCgkJICAgIl9fYXR0cmli dXRlX18gKChtb2RlKSkgaXMgZGVwcmVjYXRlZCIpOwoJICB3YXJuaW5nIChP UFRfV2F0dHJpYnV0ZXMsCgkJICAgInVzZSBfX2F0dHJpYnV0ZV9fICgodmVj dG9yX3NpemUpKSBpbnN0ZWFkIik7CgkgIHZhbGlkX21vZGUgPSB2ZWN0b3Jf bW9kZV92YWxpZF9wIChtb2RlKTsKCSAgYnJlYWs7CgoJZGVmYXVsdDoKCSAg YnJlYWs7Cgl9CiAgICAgIGlmICghdmFsaWRfbW9kZSkKCXsKCSAgZXJyb3Ig KCJ1bmFibGUgdG8gZW11bGF0ZSAlcXMiLCBwKTsKCSAgcmV0dXJuIE5VTExf VFJFRTsKCX0KCiAgICAgIGlmIChQT0lOVEVSX1RZUEVfUCAodHlwZSkpCgl7 CgkgIHRyZWUgKCpmbikodHJlZSwgZW51bSBtYWNoaW5lX21vZGUsIGJvb2wp OwoKCSAgaWYgKCF0YXJnZXRtLnZhbGlkX3BvaW50ZXJfbW9kZSAobW9kZSkp CgkgICAgewoJICAgICAgZXJyb3IgKCJpbnZhbGlkIHBvaW50ZXIgbW9kZSAl cXMiLCBwKTsKCSAgICAgIHJldHVybiBOVUxMX1RSRUU7CgkgICAgfQoKCSAg aWYgKFRSRUVfQ09ERSAodHlwZSkgPT0gUE9JTlRFUl9UWVBFKQoJICAgIGZu ID0gYnVpbGRfcG9pbnRlcl90eXBlX2Zvcl9tb2RlOwoJICBlbHNlCgkgICAg Zm4gPSBidWlsZF9yZWZlcmVuY2VfdHlwZV9mb3JfbW9kZTsKCSAgdHlwZWZt ID0gZm4gKFRSRUVfVFlQRSAodHlwZSksIG1vZGUsIGZhbHNlKTsKCX0KICAg ICAgZWxzZQoJewoJICAvKiBGb3IgZml4ZWQtcG9pbnQgbW9kZXMsIHdlIG5l ZWQgdG8gdGVzdCBpZiB0aGUgc2lnbm5lc3Mgb2YgdHlwZQoJICAgICBhbmQg dGhlIG1hY2hpbmUgbW9kZSBhcmUgY29uc2lzdGVudC4gICovCgkgIGlmIChB TExfRklYRURfUE9JTlRfTU9ERV9QIChtb2RlKQoJICAgICAgJiYgVFlQRV9V TlNJR05FRCAodHlwZSkgIT0gVU5TSUdORURfRklYRURfUE9JTlRfTU9ERV9Q IChtb2RlKSkKCSAgICB7CgkgICAgICBlcnJvciAoInNpZ25uZXNzIG9mIHR5 cGUgYW5kIG1hY2hpbmUgbW9kZSAlcXMgZG9uJ3QgbWF0Y2giLCBwKTsKCSAg ICAgIHJldHVybiBOVUxMX1RSRUU7CgkgICAgfQoJICAvKiBGb3IgZml4ZWQt cG9pbnQgbW9kZXMsIHdlIG5lZWQgdG8gcGFzcyBzYXR1cmF0aW5nIGluZm8u ICAqLwoJICB0eXBlZm0gPSBsYW5nX2hvb2tzLnR5cGVzLnR5cGVfZm9yX21v ZGUgKG1vZGUsCgkJCUFMTF9GSVhFRF9QT0lOVF9NT0RFX1AgKG1vZGUpID8g VFlQRV9TQVRVUkFUSU5HICh0eXBlKQoJCQkJCQkgICAgICA6IFRZUEVfVU5T SUdORUQgKHR5cGUpKTsKCX0KCiAgICAgIGlmICh0eXBlZm0gPT0gTlVMTF9U UkVFKQoJewoJICBlcnJvciAoIm5vIGRhdGEgdHlwZSBmb3IgbW9kZSAlcXMi LCBwKTsKCSAgcmV0dXJuIE5VTExfVFJFRTsKCX0KICAgICAgZWxzZSBpZiAo VFJFRV9DT0RFICh0eXBlKSA9PSBFTlVNRVJBTF9UWVBFKQoJewoJICAvKiBG b3IgZW51bWVyYWwgdHlwZXMsIGNvcHkgdGhlIHByZWNpc2lvbiBmcm9tIHRo ZSBpbnRlZ2VyCgkgICAgIHR5cGUgcmV0dXJuZWQgYWJvdmUuICBJZiBub3Qg YW4gSU5URUdFUl9UWVBFLCB3ZSBjYW4ndCB1c2UKCSAgICAgdGhpcyBtb2Rl IGZvciB0aGlzIHR5cGUuICAqLwoJICBpZiAoVFJFRV9DT0RFICh0eXBlZm0p ICE9IElOVEVHRVJfVFlQRSkKCSAgICB7CgkgICAgICBlcnJvciAoImNhbm5v dCB1c2UgbW9kZSAlcXMgZm9yIGVudW1lcmFsIHR5cGVzIiwgcCk7CgkgICAg ICByZXR1cm4gTlVMTF9UUkVFOwoJICAgIH0KCgkgIGlmIChmbGFncyAmIEFU VFJfRkxBR19UWVBFX0lOX1BMQUNFKQoJICAgIHsKCSAgICAgIFRZUEVfUFJF Q0lTSU9OICh0eXBlKSA9IFRZUEVfUFJFQ0lTSU9OICh0eXBlZm0pOwoJICAg ICAgdHlwZWZtID0gdHlwZTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAg ICAvKiBXZSBjYW5ub3QgYnVpbGQgYSB0eXBlIHZhcmlhbnQsIGFzIHRoZXJl J3MgY29kZSB0aGF0IGFzc3VtZXMKCQkgdGhhdCBUWVBFX01BSU5fVkFSSUFO VCBoYXMgdGhlIHNhbWUgbW9kZS4gIFRoaXMgaW5jbHVkZXMgdGhlCgkJIGRl YnVnIGdlbmVyYXRvcnMuICBJbnN0ZWFkLCBjcmVhdGUgYSBzdWJyYW5nZSB0 eXBlLiAgVGhpcwoJCSByZXN1bHRzIGluIGFsbCBvZiB0aGUgZW51bWVyYWwg dmFsdWVzIGJlaW5nIGVtaXR0ZWQgb25seSBvbmNlCgkJIGluIHRoZSBvcmln aW5hbCwgYW5kIHRoZSBzdWJ0eXBlIGdldHMgdGhlbSBieSByZWZlcmVuY2Uu ICAqLwoJICAgICAgaWYgKFRZUEVfVU5TSUdORUQgKHR5cGUpKQoJCXR5cGVm bSA9IG1ha2VfdW5zaWduZWRfdHlwZSAoVFlQRV9QUkVDSVNJT04gKHR5cGVm bSkpOwoJICAgICAgZWxzZQoJCXR5cGVmbSA9IG1ha2Vfc2lnbmVkX3R5cGUg KFRZUEVfUFJFQ0lTSU9OICh0eXBlZm0pKTsKCSAgICAgIFRSRUVfVFlQRSAo dHlwZWZtKSA9IHR5cGU7CgkgICAgfQoJfQogICAgICBlbHNlIGlmIChWRUNU T1JfTU9ERV9QIChtb2RlKQoJICAgICAgID8gVFJFRV9DT0RFICh0eXBlKSAh PSBUUkVFX0NPREUgKFRSRUVfVFlQRSAodHlwZWZtKSkKCSAgICAgICA6IFRS RUVfQ09ERSAodHlwZSkgIT0gVFJFRV9DT0RFICh0eXBlZm0pKQoJewoJICBl cnJvciAoIm1vZGUgJXFzIGFwcGxpZWQgdG8gaW5hcHByb3ByaWF0ZSB0eXBl IiwgcCk7CgkgIHJldHVybiBOVUxMX1RSRUU7Cgl9CgogICAgICAqbm9kZSA9 IHR5cGVmbTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFu ZGxlIGEgInNlY3Rpb24iIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAg IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0 cmVlCmhhbmRsZV9zZWN0aW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJl ZSBBUkdfVU5VU0VEIChuYW1lKSwgdHJlZSBhcmdzLAoJCQkgIGludCBBUkdf VU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUg ZGVjbCA9ICpub2RlOwoKICBpZiAodGFyZ2V0bS5oYXZlX25hbWVkX3NlY3Rp b25zKQogICAgewogICAgICB1c2VyX2RlZmluZWRfc2VjdGlvbl9hdHRyaWJ1 dGUgPSB0cnVlOwoKICAgICAgaWYgKChUUkVFX0NPREUgKGRlY2wpID09IEZV TkNUSU9OX0RFQ0wKCSAgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RF Q0wpCgkgICYmIFRSRUVfQ09ERSAoVFJFRV9WQUxVRSAoYXJncykpID09IFNU UklOR19DU1QpCgl7CgkgIGlmIChUUkVFX0NPREUgKGRlY2wpID09IFZBUl9E RUNMCgkgICAgICAmJiBjdXJyZW50X2Z1bmN0aW9uX2RlY2wgIT0gTlVMTF9U UkVFCgkgICAgICAmJiAhVFJFRV9TVEFUSUMgKGRlY2wpKQoJICAgIHsKCSAg ICAgIGVycm9yICgiJUpzZWN0aW9uIGF0dHJpYnV0ZSBjYW5ub3QgYmUgc3Bl Y2lmaWVkIGZvciAiCgkJICAgICAibG9jYWwgdmFyaWFibGVzIiwgZGVjbCk7 CgkgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAgICB9CgoJICAvKiBU aGUgZGVjbCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gYSBzZWN0aW9u IGF0dHJpYnV0ZQoJICAgICBmcm9tIGEgcHJldmlvdXMgZGVjbGFyYXRpb24u ICBFbnN1cmUgdGhleSBtYXRjaC4gICovCgkgIGVsc2UgaWYgKERFQ0xfU0VD VElPTl9OQU1FIChkZWNsKSAhPSBOVUxMX1RSRUUKCQkgICAmJiBzdHJjbXAg KFRSRUVfU1RSSU5HX1BPSU5URVIgKERFQ0xfU0VDVElPTl9OQU1FIChkZWNs KSksCgkJCSAgICAgIFRSRUVfU1RSSU5HX1BPSU5URVIgKFRSRUVfVkFMVUUg KGFyZ3MpKSkgIT0gMCkKCSAgICB7CgkgICAgICBlcnJvciAoInNlY3Rpb24g b2YgJXErRCBjb25mbGljdHMgd2l0aCBwcmV2aW91cyBkZWNsYXJhdGlvbiIs CgkJICAgICAqbm9kZSk7CgkgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsK CSAgICB9CgkgIGVsc2UKCSAgICBERUNMX1NFQ1RJT05fTkFNRSAoZGVjbCkg PSBUUkVFX1ZBTFVFIChhcmdzKTsKCX0KICAgICAgZWxzZQoJewoJICBlcnJv ciAoInNlY3Rpb24gYXR0cmlidXRlIG5vdCBhbGxvd2VkIGZvciAlcStEIiwg Km5vZGUpOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCX0KICAgIH0KICBl bHNlCiAgICB7CiAgICAgIGVycm9yICgiJUpzZWN0aW9uIGF0dHJpYnV0ZXMg YXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0IiwgKm5vZGUpOwog ICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5V TExfVFJFRTsKfQoKLyogSGFuZGxlIGEgImFsaWduZWQiIGF0dHJpYnV0ZTsg YXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5k bGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9hbGlnbmVkX2F0dHJpYnV0 ZSAodHJlZSAqbm9kZSwgdHJlZSBBUkdfVU5VU0VEIChuYW1lKSwgdHJlZSBh cmdzLAoJCQkgIGludCBmbGFncywgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAg dHJlZSBkZWNsID0gTlVMTF9UUkVFOwogIHRyZWUgKnR5cGUgPSBOVUxMOwog IGludCBpc190eXBlID0gMDsKICB0cmVlIGFsaWduX2V4cHIgPSAoYXJncyA/ IFRSRUVfVkFMVUUgKGFyZ3MpCgkJICAgICA6IHNpemVfaW50IChCSUdHRVNU X0FMSUdOTUVOVCAvIEJJVFNfUEVSX1VOSVQpKTsKICBpbnQgaTsKCiAgaWYg KERFQ0xfUCAoKm5vZGUpKQogICAgewogICAgICBkZWNsID0gKm5vZGU7CiAg ICAgIHR5cGUgPSAmVFJFRV9UWVBFIChkZWNsKTsKICAgICAgaXNfdHlwZSA9 IFRSRUVfQ09ERSAoKm5vZGUpID09IFRZUEVfREVDTDsKICAgIH0KICBlbHNl IGlmIChUWVBFX1AgKCpub2RlKSkKICAgIHR5cGUgPSBub2RlLCBpc190eXBl ID0gMTsKCiAgaWYgKFRSRUVfQ09ERSAoYWxpZ25fZXhwcikgIT0gSU5URUdF Ul9DU1QpCiAgICB7CiAgICAgIGVycm9yICgicmVxdWVzdGVkIGFsaWdubWVu dCBpcyBub3QgYSBjb25zdGFudCIpOwogICAgICAqbm9fYWRkX2F0dHJzID0g dHJ1ZTsKICAgIH0KICBlbHNlIGlmICgoaSA9IHRyZWVfbG9nMiAoYWxpZ25f ZXhwcikpID09IC0xKQogICAgewogICAgICBlcnJvciAoInJlcXVlc3RlZCBh bGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgMiIpOwogICAgICAqbm9fYWRk X2F0dHJzID0gdHJ1ZTsKICAgIH0KICBlbHNlIGlmIChpID4gSE9TVF9CSVRT X1BFUl9JTlQgLSAyKQogICAgewogICAgICBlcnJvciAoInJlcXVlc3RlZCBh bGlnbm1lbnQgaXMgdG9vIGxhcmdlIik7CiAgICAgICpub19hZGRfYXR0cnMg PSB0cnVlOwogICAgfQogIGVsc2UgaWYgKGlzX3R5cGUpCiAgICB7CiAgICAg IC8qIElmIHdlIGhhdmUgYSBUWVBFX0RFQ0wsIHRoZW4gY29weSB0aGUgdHlw ZSwgc28gdGhhdCB3ZQoJIGRvbid0IGFjY2lkZW50YWxseSBtb2RpZnkgYSBi dWlsdGluIHR5cGUuICBTZWUgcHVzaGRlY2wuICAqLwogICAgICBpZiAoZGVj bCAmJiBUUkVFX1RZUEUgKGRlY2wpICE9IGVycm9yX21hcmtfbm9kZQoJICAm JiBERUNMX09SSUdJTkFMX1RZUEUgKGRlY2wpID09IE5VTExfVFJFRSkKCXsK CSAgdHJlZSB0dCA9IFRSRUVfVFlQRSAoZGVjbCk7CgkgICp0eXBlID0gYnVp bGRfdmFyaWFudF90eXBlX2NvcHkgKCp0eXBlKTsKCSAgREVDTF9PUklHSU5B TF9UWVBFIChkZWNsKSA9IHR0OwoJICBUWVBFX05BTUUgKCp0eXBlKSA9IGRl Y2w7CgkgIFRSRUVfVVNFRCAoKnR5cGUpID0gVFJFRV9VU0VEIChkZWNsKTsK CSAgVFJFRV9UWVBFIChkZWNsKSA9ICp0eXBlOwoJfQogICAgICBlbHNlIGlm ICghKGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZUEVfSU5fUExBQ0UpKQoJ KnR5cGUgPSBidWlsZF92YXJpYW50X3R5cGVfY29weSAoKnR5cGUpOwoKICAg ICAgVFlQRV9BTElHTiAoKnR5cGUpID0gKDEgPDwgaSkgKiBCSVRTX1BFUl9V TklUOwogICAgICBUWVBFX1VTRVJfQUxJR04gKCp0eXBlKSA9IDE7CiAgICB9 CiAgZWxzZSBpZiAoISBWQVJfT1JfRlVOQ1RJT05fREVDTF9QIChkZWNsKQoJ ICAgJiYgVFJFRV9DT0RFIChkZWNsKSAhPSBGSUVMRF9ERUNMKQogICAgewog ICAgICBlcnJvciAoImFsaWdubWVudCBtYXkgbm90IGJlIHNwZWNpZmllZCBm b3IgJXErRCIsIGRlY2wpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsK ICAgIH0KICBlbHNlIGlmIChUUkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9O X0RFQ0wKCSAgICYmIERFQ0xfQUxJR04gKGRlY2wpID4gKDEgPDwgaSkgKiBC SVRTX1BFUl9VTklUKQogICAgewogICAgICBpZiAoREVDTF9VU0VSX0FMSUdO IChkZWNsKSkKCWVycm9yICgiYWxpZ25tZW50IGZvciAlcStEIHdhcyBwcmV2 aW91c2x5IHNwZWNpZmllZCBhcyAlZCAiCgkgICAgICAgImFuZCBtYXkgbm90 IGJlIGRlY3JlYXNlZCIsIGRlY2wsCgkgICAgICAgREVDTF9BTElHTiAoZGVj bCkgLyBCSVRTX1BFUl9VTklUKTsKICAgICAgZWxzZQoJZXJyb3IgKCJhbGln bm1lbnQgZm9yICVxK0QgbXVzdCBiZSBhdCBsZWFzdCAlZCIsIGRlY2wsCgkg ICAgICAgREVDTF9BTElHTiAoZGVjbCkgLyBCSVRTX1BFUl9VTklUKTsKICAg ICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CiAgZWxzZQogICAgewog ICAgICBERUNMX0FMSUdOIChkZWNsKSA9ICgxIDw8IGkpICogQklUU19QRVJf VU5JVDsKICAgICAgREVDTF9VU0VSX0FMSUdOIChkZWNsKSA9IDE7CiAgICB9 CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJ3ZWFrIiBh dHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRl X3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfd2Vha19h dHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkgICAgICAgdHJl ZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkgICAgICAgaW50IEFSR19VTlVTRUQg KGZsYWdzKSwKCQkgICAgICAgYm9vbCAqIEFSR19VTlVTRUQgKG5vX2FkZF9h dHRycykpCnsKICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05f REVDTAogICAgICB8fCBUUkVFX0NPREUgKCpub2RlKSA9PSBWQVJfREVDTCkK ICAgIGRlY2xhcmVfd2VhayAoKm5vZGUpOwogIGVsc2UKICAgIHdhcm5pbmcg KE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5h bWUpOwogICAgCQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUg YW4gImFsaWFzIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1 Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpo YW5kbGVfYWxpYXNfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUs IHRyZWUgYXJncywKCQkJaW50IEFSR19VTlVTRUQgKGZsYWdzKSwgYm9vbCAq bm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CgogIGlmICgo VFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMICYmIERFQ0xfSU5J VElBTCAoZGVjbCkpCiAgICAgIHx8IChUUkVFX0NPREUgKGRlY2wpICE9IEZV TkNUSU9OX0RFQ0wgCgkgICYmIFRSRUVfUFVCTElDIChkZWNsKSAmJiAhREVD TF9FWFRFUk5BTCAoZGVjbCkpCiAgICAgIC8qIEEgc3RhdGljIHZhcmlhYmxl IGRlY2xhcmF0aW9uIGlzIGFsd2F5cyBhIHRlbnRhdGl2ZSBkZWZpbml0aW9u LAoJIGJ1dCB0aGUgYWxpYXMgaXMgYSBub24tdGVudGF0aXZlIGRlZmluaXRp b24gd2hpY2ggb3ZlcnJpZGVzLiAgKi8KICAgICAgfHwgKFRSRUVfQ09ERSAo ZGVjbCkgIT0gRlVOQ1RJT05fREVDTCAKCSAgJiYgISBUUkVFX1BVQkxJQyAo ZGVjbCkgJiYgREVDTF9JTklUSUFMIChkZWNsKSkpCiAgICB7CiAgICAgIGVy cm9yICgiJXErRCBkZWZpbmVkIGJvdGggbm9ybWFsbHkgYW5kIGFzIGFuIGFs aWFzIiwgZGVjbCk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAg fQoKICAvKiBOb3RlIHRoYXQgdGhlIHZlcnkgZmlyc3QgdGltZSB3ZSBwcm9j ZXNzIGEgbmVzdGVkIGRlY2xhcmF0aW9uLAogICAgIGRlY2xfZnVuY3Rpb25f Y29udGV4dCB3aWxsIG5vdCBiZSBzZXQuICBJbmRlZWQsICp3b3VsZCogbmV2 ZXIKICAgICBiZSBzZXQgZXhjZXB0IGZvciB0aGUgREVDTF9JTklUSUFML0RF Q0xfRVhURVJOQUwgZnJvYmJlcnkgdGhhdAogICAgIHdlIGRvIGJlbG93LiAg QWZ0ZXIgc3VjaCBmcm9iYmVyeSwgcHVzaGRlY2wgd291bGQgc2V0IHRoZSBj b250ZXh0LgogICAgIEluIGFueSBjYXNlLCB0aGlzIGlzIG5ldmVyIHdoYXQg d2Ugd2FudC4gICovCiAgZWxzZSBpZiAoZGVjbF9mdW5jdGlvbl9jb250ZXh0 IChkZWNsKSA9PSAwICYmIGN1cnJlbnRfZnVuY3Rpb25fZGVjbCA9PSBOVUxM KQogICAgewogICAgICB0cmVlIGlkOwoKICAgICAgaWQgPSBUUkVFX1ZBTFVF IChhcmdzKTsKICAgICAgaWYgKFRSRUVfQ09ERSAoaWQpICE9IFNUUklOR19D U1QpCgl7CgkgIGVycm9yICgiYWxpYXMgYXJndW1lbnQgbm90IGEgc3RyaW5n Iik7CgkgICpub19hZGRfYXR0cnMgPSB0cnVlOwoJICByZXR1cm4gTlVMTF9U UkVFOwoJfQogICAgICBpZCA9IGdldF9pZGVudGlmaWVyIChUUkVFX1NUUklO R19QT0lOVEVSIChpZCkpOwogICAgICAvKiBUaGlzIGNvdW50cyBhcyBhIHVz ZSBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8uICAqLwogICAgICBUUkVFX1VT RUQgKGlkKSA9IDE7CgogICAgICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBG VU5DVElPTl9ERUNMKQoJREVDTF9JTklUSUFMIChkZWNsKSA9IGVycm9yX21h cmtfbm9kZTsKICAgICAgZWxzZQoJewoJICBpZiAobG9va3VwX2F0dHJpYnV0 ZSAoIndlYWtyZWYiLCBERUNMX0FUVFJJQlVURVMgKGRlY2wpKSkKCSAgICBE RUNMX0VYVEVSTkFMIChkZWNsKSA9IDE7CgkgIGVsc2UKCSAgICBERUNMX0VY VEVSTkFMIChkZWNsKSA9IDA7CgkgIFRSRUVfU1RBVElDIChkZWNsKSA9IDE7 Cgl9CiAgICB9CiAgZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0 dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAg ICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxM X1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJ3ZWFrcmVmIiBhdHRyaWJ1dGU7IGFy Z3VtZW50cyBhcyBpbiBzdHJ1Y3QKICAgYXR0cmlidXRlX3NwZWMuaGFuZGxl ci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfd2Vha3JlZl9hdHRyaWJ1dGUg KHRyZWUgKm5vZGUsIHRyZWUgQVJHX1VOVVNFRCAobmFtZSksIHRyZWUgYXJn cywKCQkJICBpbnQgZmxhZ3MsIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRy ZWUgYXR0ciA9IE5VTExfVFJFRTsKCiAgLyogV2UgbXVzdCBpZ25vcmUgdGhl IGF0dHJpYnV0ZSB3aGVuIGl0IGlzIGFzc29jaWF0ZWQgd2l0aAogICAgIGxv Y2FsLXNjb3BlZCBkZWNscywgc2luY2UgYXR0cmlidXRlIGFsaWFzIGlzIGln bm9yZWQgYW5kIG1hbnkKICAgICBzdWNoIHN5bWJvbHMgZG8gbm90IGV2ZW4g aGF2ZSBhIERFQ0xfV0VBSyBmaWVsZC4gICovCiAgaWYgKGRlY2xfZnVuY3Rp b25fY29udGV4dCAoKm5vZGUpIHx8IGN1cnJlbnRfZnVuY3Rpb25fZGVjbCkK ICAgIHsKICAgICAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0 dHJpYnV0ZSBpZ25vcmVkIiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMg PSB0cnVlOwogICAgICByZXR1cm4gTlVMTF9UUkVFOwogICAgfQoKICAvKiBU aGUgaWRlYSBoZXJlIGlzIHRoYXQgYHdlYWtyZWYoIm5hbWUiKScgbXV0YXRl cyBpbnRvIGB3ZWFrcmVmLAogICAgIGFsaWFzKCJuYW1lIiknLCBhbmQgd2Vh a3JlZiB3aXRob3V0IGFyZ3VtZW50cywgaW4gdHVybiwKICAgICBpbXBsaWNp dGx5IGFkZHMgd2Vhay4gKi8KCiAgaWYgKGFyZ3MpCiAgICB7CiAgICAgIGF0 dHIgPSB0cmVlX2NvbnMgKGdldF9pZGVudGlmaWVyICgiYWxpYXMiKSwgYXJn cywgYXR0cik7CiAgICAgIGF0dHIgPSB0cmVlX2NvbnMgKGdldF9pZGVudGlm aWVyICgid2Vha3JlZiIpLCBOVUxMX1RSRUUsIGF0dHIpOwoKICAgICAgKm5v X2FkZF9hdHRycyA9IHRydWU7CgogICAgICBkZWNsX2F0dHJpYnV0ZXMgKG5v ZGUsIGF0dHIsIGZsYWdzKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGlm IChsb29rdXBfYXR0cmlidXRlICgiYWxpYXMiLCBERUNMX0FUVFJJQlVURVMg KCpub2RlKSkpCgllcnJvciAoIiVKd2Vha3JlZiBhdHRyaWJ1dGUgbXVzdCBh cHBlYXIgYmVmb3JlIGFsaWFzIGF0dHJpYnV0ZSIsCgkgICAgICAgKm5vZGUp OwoKICAgICAgLyogQ2FuJ3QgY2FsbCBkZWNsYXJlX3dlYWsgYmVjYXVzZSBp dCB3YW50cyB0aGlzIHRvIGJlIFRSRUVfUFVCTElDLAoJIGFuZCB0aGF0IGlz bid0IHN1cHBvcnRlZDsgYW5kIGJlY2F1c2UgaXQgd2FudHMgdG8gYWRkIGl0 IHRvCgkgdGhlIGxpc3Qgb2Ygd2VhayBkZWNscywgd2hpY2ggaXNuJ3QgaGVs cGZ1bC4gICovCiAgICAgIERFQ0xfV0VBSyAoKm5vZGUpID0gMTsKICAgIH0K CiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGFuICJ2aXNpYmls aXR5IiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0 cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVf dmlzaWJpbGl0eV9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwg dHJlZSBhcmdzLAoJCQkgICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksCgkJ CSAgICAgYm9vbCAqQVJHX1VOVVNFRCAobm9fYWRkX2F0dHJzKSkKewogIHRy ZWUgZGVjbCA9ICpub2RlOwogIHRyZWUgaWQgPSBUUkVFX1ZBTFVFIChhcmdz KTsKICBlbnVtIHN5bWJvbF92aXNpYmlsaXR5IHZpczsKCiAgaWYgKFRZUEVf UCAoKm5vZGUpKQogICAgewogICAgICBpZiAoVFJFRV9DT0RFICgqbm9kZSkg PT0gRU5VTUVSQUxfVFlQRSkKCS8qIE9LICovOwogICAgICBlbHNlIGlmIChU UkVFX0NPREUgKCpub2RlKSAhPSBSRUNPUkRfVFlQRSAmJiBUUkVFX0NPREUg KCpub2RlKSAhPSBVTklPTl9UWVBFKQoJewoJICB3YXJuaW5nIChPUFRfV2F0 dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQgb24gbm9uLWNsYXNz IHR5cGVzIiwKCQkgICBuYW1lKTsKCSAgcmV0dXJuIE5VTExfVFJFRTsKCX0K ICAgICAgZWxzZSBpZiAoVFlQRV9GSUVMRFMgKCpub2RlKSkKCXsKCSAgZXJy b3IgKCIlcUUgYXR0cmlidXRlIGlnbm9yZWQgYmVjYXVzZSAlcVQgaXMgYWxy ZWFkeSBkZWZpbmVkIiwKCQkgbmFtZSwgKm5vZGUpOwoJICByZXR1cm4gTlVM TF9UUkVFOwoJfQogICAgfQogIGVsc2UgaWYgKGRlY2xfZnVuY3Rpb25fY29u dGV4dCAoZGVjbCkgIT0gMCB8fCAhVFJFRV9QVUJMSUMgKGRlY2wpKQogICAg ewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmli dXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgcmV0dXJuIE5VTExfVFJFRTsK ICAgIH0KCiAgaWYgKFRSRUVfQ09ERSAoaWQpICE9IFNUUklOR19DU1QpCiAg ICB7CiAgICAgIGVycm9yICgidmlzaWJpbGl0eSBhcmd1bWVudCBub3QgYSBz dHJpbmciKTsKICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiAgLyog IElmIHRoaXMgaXMgYSB0eXBlLCBzZXQgdGhlIHZpc2liaWxpdHkgb24gdGhl IHR5cGUgZGVjbC4gICovCiAgaWYgKFRZUEVfUCAoZGVjbCkpCiAgICB7CiAg ICAgIGRlY2wgPSBUWVBFX05BTUUgKGRlY2wpOwogICAgICBpZiAoIWRlY2wp CglyZXR1cm4gTlVMTF9UUkVFOwogICAgICBpZiAoVFJFRV9DT0RFIChkZWNs KSA9PSBJREVOVElGSUVSX05PREUpCgl7CgkgICB3YXJuaW5nIChPUFRfV2F0 dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQgb24gdHlwZXMiLAoJ CSAgICBuYW1lKTsKCSAgIHJldHVybiBOVUxMX1RSRUU7Cgl9CiAgICB9Cgog IGlmIChzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKGlkKSwgImRlZmF1 bHQiKSA9PSAwKQogICAgdmlzID0gVklTSUJJTElUWV9ERUZBVUxUOwogIGVs c2UgaWYgKHN0cmNtcCAoVFJFRV9TVFJJTkdfUE9JTlRFUiAoaWQpLCAiaW50 ZXJuYWwiKSA9PSAwKQogICAgdmlzID0gVklTSUJJTElUWV9JTlRFUk5BTDsK ICBlbHNlIGlmIChzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKGlkKSwg ImhpZGRlbiIpID09IDApCiAgICB2aXMgPSBWSVNJQklMSVRZX0hJRERFTjsK ICBlbHNlIGlmIChzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKGlkKSwg InByb3RlY3RlZCIpID09IDApCiAgICB2aXMgPSBWSVNJQklMSVRZX1BST1RF Q1RFRDsKICBlbHNlCiAgICB7CiAgICAgIGVycm9yICgidmlzaWJpbGl0eSBh cmd1bWVudCBtdXN0IGJlIG9uZSBvZiBcImRlZmF1bHRcIiwgXCJoaWRkZW5c IiwgXCJwcm90ZWN0ZWRcIiBvciBcImludGVybmFsXCIiKTsKICAgICAgdmlz ID0gVklTSUJJTElUWV9ERUZBVUxUOwogICAgfQoKICBpZiAoREVDTF9WSVNJ QklMSVRZX1NQRUNJRklFRCAoZGVjbCkKICAgICAgJiYgdmlzICE9IERFQ0xf VklTSUJJTElUWSAoZGVjbCkpCiAgICB7CiAgICAgIHRyZWUgYXR0cmlidXRl cyA9IChUWVBFX1AgKCpub2RlKQoJCQkgPyBUWVBFX0FUVFJJQlVURVMgKCpu b2RlKQoJCQkgOiBERUNMX0FUVFJJQlVURVMgKGRlY2wpKTsKICAgICAgaWYg KGxvb2t1cF9hdHRyaWJ1dGUgKCJ2aXNpYmlsaXR5IiwgYXR0cmlidXRlcykp CgllcnJvciAoIiVxRCByZWRlY2xhcmVkIHdpdGggZGlmZmVyZW50IHZpc2li aWxpdHkiLCBkZWNsKTsKICAgICAgZWxzZSBpZiAoVEFSR0VUX0RMTElNUE9S VF9ERUNMX0FUVFJJQlVURVMKCSAgICAgICAmJiBsb29rdXBfYXR0cmlidXRl ICgiZGxsaW1wb3J0IiwgYXR0cmlidXRlcykpCgllcnJvciAoIiVxRCB3YXMg ZGVjbGFyZWQgJXFzIHdoaWNoIGltcGxpZXMgZGVmYXVsdCB2aXNpYmlsaXR5 IiwKCSAgICAgICBkZWNsLCAiZGxsaW1wb3J0Iik7CiAgICAgIGVsc2UgaWYg KFRBUkdFVF9ETExJTVBPUlRfREVDTF9BVFRSSUJVVEVTCgkgICAgICAgJiYg bG9va3VwX2F0dHJpYnV0ZSAoImRsbGV4cG9ydCIsIGF0dHJpYnV0ZXMpKQoJ ZXJyb3IgKCIlcUQgd2FzIGRlY2xhcmVkICVxcyB3aGljaCBpbXBsaWVzIGRl ZmF1bHQgdmlzaWJpbGl0eSIsCgkgICAgICAgZGVjbCwgImRsbGV4cG9ydCIp OwogICAgfQoKICBERUNMX1ZJU0lCSUxJVFkgKGRlY2wpID0gdmlzOwogIERF Q0xfVklTSUJJTElUWV9TUEVDSUZJRUQgKGRlY2wpID0gMTsKCiAgLyogR28g YWhlYWQgYW5kIGF0dGFjaCB0aGUgYXR0cmlidXRlIHRvIHRoZSBub2RlIGFz IHdlbGwuICBUaGlzIGlzIG5lZWRlZAogICAgIHNvIHdlIGNhbiBkZXRlcm1p bmUgd2hldGhlciB3ZSBoYXZlIFZJU0lCSUxJVFlfREVGQVVMVCBiZWNhdXNl IHRoZQogICAgIHZpc2liaWxpdHkgd2FzIG5vdCBzcGVjaWZpZWQsIG9yIGJl Y2F1c2UgaXQgd2FzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbgogICAgIGZyb20g dGhlIGNvbnRhaW5pbmcgc2NvcGUuICAqLwoKICByZXR1cm4gTlVMTF9UUkVF Owp9CgovKiBEZXRlcm1pbmUgdGhlIEVMRiBzeW1ib2wgdmlzaWJpbGl0eSBm b3IgREVDTCwgd2hpY2ggaXMgZWl0aGVyIGEKICAgdmFyaWFibGUgb3IgYSBm dW5jdGlvbi4gIEl0IGlzIGFuIGVycm9yIHRvIHVzZSB0aGlzIGZ1bmN0aW9u IGlmIGEKICAgZGVmaW5pdGlvbiBvZiBERUNMIGlzIG5vdCBhdmFpbGFibGUg aW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgogICBSZXR1cm5zIHRydWUgaWYg dGhlIGZpbmFsIHZpc2liaWxpdHkgaGFzIGJlZW4gZGV0ZXJtaW5lZCBieSB0 aGlzCiAgIGZ1bmN0aW9uOyBmYWxzZSBpZiB0aGUgY2FsbGVyIGlzIGZyZWUg dG8gbWFrZSBhZGRpdGlvbmFsCiAgIG1vZGlmaWNhdGlvbnMuICAqLwoKYm9v bApjX2RldGVybWluZV92aXNpYmlsaXR5ICh0cmVlIGRlY2wpCnsKICBnY2Nf YXNzZXJ0IChUUkVFX0NPREUgKGRlY2wpID09IFZBUl9ERUNMCgkgICAgICB8 fCBUUkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9OX0RFQ0wpOwoKICAvKiBJ ZiB0aGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB0aGUgdmlzaWJpbGl0 eSB3aXRoIGFuCiAgICAgYXR0cmlidXRlLCBob25vciB0aGF0LiAgREVDTF9W SVNJQklMSVRZIHdpbGwgaGF2ZSBiZWVuIHNldCBkdXJpbmcKICAgICB0aGUg cHJvY2Vzc2luZyBvZiB0aGUgYXR0cmlidXRlLiAgV2UgY2hlY2sgZm9yIGFu IGV4cGxpY2l0CiAgICAgYXR0cmlidXRlLCByYXRoZXIgdGhhbiBqdXN0IGNo ZWNraW5nIERFQ0xfVklTSUJJTElUWV9TUEVDSUZJRUQsCiAgICAgdG8gZGlz dGluZ3Vpc2ggdGhlIHVzZSBvZiBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgdXNl IG9mIGEgIiNwcmFnbWEKICAgICBHQ0MgdmlzaWJpbGl0eSBwdXNoKC4uLiki OyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2Ugc3RpbGwgd2FudCBvdGhlcgogICAg IGNvbnNpZGVyYXRpb25zIHRvIGJlIGFibGUgdG8gb3ZlcnJ1bGUgdGhlICNw cmFnbWEuICAqLwogIGlmIChsb29rdXBfYXR0cmlidXRlICgidmlzaWJpbGl0 eSIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpCiAgICAgIHx8IChUQVJHRVRf RExMSU1QT1JUX0RFQ0xfQVRUUklCVVRFUwoJICAmJiAobG9va3VwX2F0dHJp YnV0ZSAoImRsbGltcG9ydCIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpCgkg ICAgICB8fCBsb29rdXBfYXR0cmlidXRlICgiZGxsZXhwb3J0IiwgREVDTF9B VFRSSUJVVEVTIChkZWNsKSkpKSkKICAgIHJldHVybiB0cnVlOwoKICAvKiBT ZXQgZGVmYXVsdCB2aXNpYmlsaXR5IHRvIHdoYXRldmVyIHRoZSB1c2VyIHN1 cHBsaWVkIHdpdGgKICAgICB2aXNpYmlsaXR5X3NwZWNpZmllZCBkZXBlbmRp bmcgb24gI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eS4gICovCiAgaWYgKCFERUNM X1ZJU0lCSUxJVFlfU1BFQ0lGSUVEIChkZWNsKSkKICAgIHsKICAgICAgREVD TF9WSVNJQklMSVRZIChkZWNsKSA9IGRlZmF1bHRfdmlzaWJpbGl0eTsKICAg ICAgREVDTF9WSVNJQklMSVRZX1NQRUNJRklFRCAoZGVjbCkgPSB2aXNpYmls aXR5X29wdGlvbnMuaW5wcmFnbWE7CiAgICB9CiAgcmV0dXJuIGZhbHNlOwp9 CgovKiBIYW5kbGUgYW4gInRsc19tb2RlbCIgYXR0cmlidXRlOyBhcmd1bWVu dHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAq LwoKc3RhdGljIHRyZWUKaGFuZGxlX3Rsc19tb2RlbF9hdHRyaWJ1dGUgKHRy ZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzLAoJCQkgICAgaW50IEFS R19VTlVTRUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJl ZSBpZDsKICB0cmVlIGRlY2wgPSAqbm9kZTsKICBlbnVtIHRsc19tb2RlbCBr aW5kOwoKICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCiAgaWYgKCFERUNMX1RI UkVBRF9MT0NBTF9QIChkZWNsKSkKICAgIHsKICAgICAgd2FybmluZyAoT1BU X1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFtZSk7 CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIGtpbmQgPSBERUNM X1RMU19NT0RFTCAoZGVjbCk7CiAgaWQgPSBUUkVFX1ZBTFVFIChhcmdzKTsK ICBpZiAoVFJFRV9DT0RFIChpZCkgIT0gU1RSSU5HX0NTVCkKICAgIHsKICAg ICAgZXJyb3IgKCJ0bHNfbW9kZWwgYXJndW1lbnQgbm90IGEgc3RyaW5nIik7 CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIGlmICghc3RyY21w IChUUkVFX1NUUklOR19QT0lOVEVSIChpZCksICJsb2NhbC1leGVjIikpCiAg ICBraW5kID0gVExTX01PREVMX0xPQ0FMX0VYRUM7CiAgZWxzZSBpZiAoIXN0 cmNtcCAoVFJFRV9TVFJJTkdfUE9JTlRFUiAoaWQpLCAiaW5pdGlhbC1leGVj IikpCiAgICBraW5kID0gVExTX01PREVMX0lOSVRJQUxfRVhFQzsKICBlbHNl IGlmICghc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChpZCksICJsb2Nh bC1keW5hbWljIikpCiAgICBraW5kID0gb3B0aW1pemUgPyBUTFNfTU9ERUxf TE9DQUxfRFlOQU1JQyA6IFRMU19NT0RFTF9HTE9CQUxfRFlOQU1JQzsKICBl bHNlIGlmICghc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChpZCksICJn bG9iYWwtZHluYW1pYyIpKQogICAga2luZCA9IFRMU19NT0RFTF9HTE9CQUxf RFlOQU1JQzsKICBlbHNlCiAgICBlcnJvciAoInRsc19tb2RlbCBhcmd1bWVu dCBtdXN0IGJlIG9uZSBvZiBcImxvY2FsLWV4ZWNcIiwgXCJpbml0aWFsLWV4 ZWNcIiwgXCJsb2NhbC1keW5hbWljXCIgb3IgXCJnbG9iYWwtZHluYW1pY1wi Iik7CgogIERFQ0xfVExTX01PREVMIChkZWNsKSA9IGtpbmQ7CiAgcmV0dXJu IE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm5vX2luc3RydW1lbnRfZnVu Y3Rpb24iIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBh dHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRs ZV9ub19pbnN0cnVtZW50X2Z1bmN0aW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9k ZSwgdHJlZSBuYW1lLAoJCQkJCSB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJ CQkJCSBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkJCSBib29sICpub19h ZGRfYXR0cnMpCnsKICB0cmVlIGRlY2wgPSAqbm9kZTsKCiAgaWYgKFRSRUVf Q09ERSAoZGVjbCkgIT0gRlVOQ1RJT05fREVDTCkKICAgIHsKICAgICAgZXJy b3IgKCIlSiVxRSBhdHRyaWJ1dGUgYXBwbGllcyBvbmx5IHRvIGZ1bmN0aW9u cyIsIGRlY2wsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsK ICAgIH0KICBlbHNlIGlmIChERUNMX0lOSVRJQUwgKGRlY2wpKQogICAgewog ICAgICBlcnJvciAoIiVKY2FuJSd0IHNldCAlcUUgYXR0cmlidXRlIGFmdGVy IGRlZmluaXRpb24iLCBkZWNsLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRy cyA9IHRydWU7CiAgICB9CiAgZWxzZQogICAgREVDTF9OT19JTlNUUlVNRU5U X0ZVTkNUSU9OX0VOVFJZX0VYSVQgKGRlY2wpID0gMTsKCiAgcmV0dXJuIE5V TExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm1hbGxvYyIgYXR0cmlidXRlOyBh cmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRs ZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX21hbGxvY19hdHRyaWJ1dGUg KHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBBUkdfVU5VU0VEIChhcmdz KSwKCQkJIGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9h dHRycykKewogIGlmIChUUkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9E RUNMCiAgICAgICYmIFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKFRSRUVf VFlQRSAoKm5vZGUpKSkpCiAgICBERUNMX0lTX01BTExPQyAoKm5vZGUpID0g MTsKICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgImFsbG9jX3NpemUiIGF0dHJpYnV0ZTsgYXJndW1l bnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAg Ki8KCnN0YXRpYyB0cmVlCmhhbmRsZV9hbGxvY19zaXplX2F0dHJpYnV0ZSAo dHJlZSAqbm9kZSwgdHJlZSBBUkdfVU5VU0VEIChuYW1lKSwgdHJlZSBhcmdz LAoJCQkgICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2Fk ZF9hdHRycykKewogIHRyZWUgcGFyYW1zID0gVFlQRV9BUkdfVFlQRVMgKCpu b2RlKTsKICB1bnNpZ25lZCBhcmdfY291bnQgPSAwOwoKICBmb3IgKDsgVFJF RV9DSEFJTiAocGFyYW1zKTsgcGFyYW1zID0gVFJFRV9DSEFJTiAocGFyYW1z KSkKICAgIGFyZ19jb3VudCArKzsKCiAgZm9yICg7IGFyZ3M7IGFyZ3MgPSBU UkVFX0NIQUlOIChhcmdzKSkKICAgIHsKICAgICAgdHJlZSBwb3NpdGlvbiA9 IFRSRUVfVkFMVUUgKGFyZ3MpOwoKICAgICAgaWYgKFRSRUVfQ09ERSAocG9z aXRpb24pICE9IElOVEVHRVJfQ1NUCgkgIHx8IFRSRUVfSU5UX0NTVF9ISUdI IChwb3NpdGlvbikgCgkgIHx8IFRSRUVfSU5UX0NTVF9MT1cgKHBvc2l0aW9u KSA8IDEKCSAgfHwgVFJFRV9JTlRfQ1NUX0xPVyAocG9zaXRpb24pID4gYXJn X2NvdW50ICkKCXsKCSAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAKCSAg ICAgICAgICAgImFsbG9jX3NpemUgcGFyYW1ldGVyIG91dHNpZGUgcmFuZ2Ui KTsKCSAgKm5vX2FkZF9hdHRycyA9IHRydWU7CgkgIHJldHVybiBOVUxMX1RS RUU7Cgl9CiAgICB9CiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxl IGEgInJldHVybnNfdHdpY2UiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGlu CiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRp YyB0cmVlCmhhbmRsZV9yZXR1cm5zX3R3aWNlX2F0dHJpYnV0ZSAodHJlZSAq bm9kZSwgdHJlZSBuYW1lLCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkg aW50IEFSR19VTlVTRUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7 CiAgaWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAg ICBERUNMX0lTX1JFVFVSTlNfVFdJQ0UgKCpub2RlKSA9IDE7CiAgZWxzZQog ICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0 cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9 IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRs ZSBhICJub19saW1pdF9zdGFjayIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMg aW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3Rh dGljIHRyZWUKaGFuZGxlX25vX2xpbWl0X3N0YWNrX2F0dHJpYnV0ZSAodHJl ZSAqbm9kZSwgdHJlZSBuYW1lLAoJCQkJIHRyZWUgQVJHX1VOVVNFRCAoYXJn cyksCgkJCQkgaW50IEFSR19VTlVTRUQgKGZsYWdzKSwKCQkJCSBib29sICpu b19hZGRfYXR0cnMpCnsKICB0cmVlIGRlY2wgPSAqbm9kZTsKCiAgaWYgKFRS RUVfQ09ERSAoZGVjbCkgIT0gRlVOQ1RJT05fREVDTCkKICAgIHsKICAgICAg ZXJyb3IgKCIlSiVxRSBhdHRyaWJ1dGUgYXBwbGllcyBvbmx5IHRvIGZ1bmN0 aW9ucyIsIGRlY2wsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1 ZTsKICAgIH0KICBlbHNlIGlmIChERUNMX0lOSVRJQUwgKGRlY2wpKQogICAg ewogICAgICBlcnJvciAoIiVKY2FuJSd0IHNldCAlcUUgYXR0cmlidXRlIGFm dGVyIGRlZmluaXRpb24iLCBkZWNsLCBuYW1lKTsKICAgICAgKm5vX2FkZF9h dHRycyA9IHRydWU7CiAgICB9CiAgZWxzZQogICAgREVDTF9OT19MSU1JVF9T VEFDSyAoZGVjbCkgPSAxOwoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBI YW5kbGUgYSAicHVyZSIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAg c3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRy ZWUKaGFuZGxlX3B1cmVfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5h bWUsIHRyZWUgQVJHX1VOVVNFRCAoYXJncyksCgkJICAgICAgIGludCBBUkdf VU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykKewogIGlmIChU UkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKQogICAgREVDTF9J U19QVVJFICgqbm9kZSkgPSAxOwogIC8qID8/PyBUT0RPOiBTdXBwb3J0IHR5 cGVzLiAgKi8KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0 cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAg ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExf VFJFRTsKfQoKLyogSGFuZGxlIGEgIm5vIHZvcHMiIGF0dHJpYnV0ZTsgYXJn dW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVy LiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9ub3ZvcHNfYXR0cmlidXRlICh0 cmVlICpub2RlLCB0cmVlIEFSR19VTlVTRUQgKG5hbWUpLAoJCQkgdHJlZSBB UkdfVU5VU0VEIChhcmdzKSwgaW50IEFSR19VTlVTRUQgKGZsYWdzKSwKCQkJ IGJvb2wgKkFSR19VTlVTRUQgKG5vX2FkZF9hdHRycykpCnsKICBnY2NfYXNz ZXJ0IChUUkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKTsKICBE RUNMX0lTX05PVk9QUyAoKm5vZGUpID0gMTsKICByZXR1cm4gTlVMTF9UUkVF Owp9CgovKiBIYW5kbGUgYSAiZGVwcmVjYXRlZCIgYXR0cmlidXRlOyBhcmd1 bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIu ICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX2RlcHJlY2F0ZWRfYXR0cmlidXRl ICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJCSAgICAgdHJlZSBBUkdfVU5V U0VEIChhcmdzKSwgaW50IGZsYWdzLAoJCQkgICAgIGJvb2wgKm5vX2FkZF9h dHRycykKewogIHRyZWUgdHlwZSA9IE5VTExfVFJFRTsKICBpbnQgd2FybiA9 IDA7CiAgdHJlZSB3aGF0ID0gTlVMTF9UUkVFOwoKICBpZiAoREVDTF9QICgq bm9kZSkpCiAgICB7CiAgICAgIHRyZWUgZGVjbCA9ICpub2RlOwogICAgICB0 eXBlID0gVFJFRV9UWVBFIChkZWNsKTsKCiAgICAgIGlmIChUUkVFX0NPREUg KGRlY2wpID09IFRZUEVfREVDTAoJICB8fCBUUkVFX0NPREUgKGRlY2wpID09 IFBBUk1fREVDTAoJICB8fCBUUkVFX0NPREUgKGRlY2wpID09IFZBUl9ERUNM CgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTAoJICB8 fCBUUkVFX0NPREUgKGRlY2wpID09IEZJRUxEX0RFQ0wpCglUUkVFX0RFUFJF Q0FURUQgKGRlY2wpID0gMTsKICAgICAgZWxzZQoJd2FybiA9IDE7CiAgICB9 CiAgZWxzZSBpZiAoVFlQRV9QICgqbm9kZSkpCiAgICB7CiAgICAgIGlmICgh KGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZUEVfSU5fUExBQ0UpKQoJKm5v ZGUgPSBidWlsZF92YXJpYW50X3R5cGVfY29weSAoKm5vZGUpOwogICAgICBU UkVFX0RFUFJFQ0FURUQgKCpub2RlKSA9IDE7CiAgICAgIHR5cGUgPSAqbm9k ZTsKICAgIH0KICBlbHNlCiAgICB3YXJuID0gMTsKCiAgaWYgKHdhcm4pCiAg ICB7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgICBpZiAodHlw ZSAmJiBUWVBFX05BTUUgKHR5cGUpKQoJewoJICBpZiAoVFJFRV9DT0RFIChU WVBFX05BTUUgKHR5cGUpKSA9PSBJREVOVElGSUVSX05PREUpCgkgICAgd2hh dCA9IFRZUEVfTkFNRSAoKm5vZGUpOwoJICBlbHNlIGlmIChUUkVFX0NPREUg KFRZUEVfTkFNRSAodHlwZSkpID09IFRZUEVfREVDTAoJCSAgICYmIERFQ0xf TkFNRSAoVFlQRV9OQU1FICh0eXBlKSkpCgkgICAgd2hhdCA9IERFQ0xfTkFN RSAoVFlQRV9OQU1FICh0eXBlKSk7Cgl9CiAgICAgIGlmICh3aGF0KQoJd2Fy bmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVk IGZvciAlcUUiLCBuYW1lLCB3aGF0KTsKICAgICAgZWxzZQoJd2FybmluZyAo T1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFt ZSk7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBh ICJ2ZWN0b3Jfc2l6ZSIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAg c3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRy ZWUKaGFuZGxlX3ZlY3Rvcl9zaXplX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwg dHJlZSBuYW1lLCB0cmVlIGFyZ3MsCgkJCSAgICAgIGludCBBUkdfVU5VU0VE IChmbGFncyksCgkJCSAgICAgIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHVu c2lnbmVkIEhPU1RfV0lERV9JTlQgdmVjc2l6ZSwgbnVuaXRzOwogIGVudW0g bWFjaGluZV9tb2RlIG9yaWdfbW9kZTsKICB0cmVlIHR5cGUgPSAqbm9kZSwg bmV3X3R5cGUsIHNpemU7CgogICpub19hZGRfYXR0cnMgPSB0cnVlOwoKICBz aXplID0gVFJFRV9WQUxVRSAoYXJncyk7CgogIGlmICghaG9zdF9pbnRlZ2Vy cCAoc2l6ZSwgMSkpCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmli dXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICBy ZXR1cm4gTlVMTF9UUkVFOwogICAgfQoKICAvKiBHZXQgdGhlIHZlY3RvciBz aXplIChpbiBieXRlcykuICAqLwogIHZlY3NpemUgPSB0cmVlX2xvd19jc3Qg KHNpemUsIDEpOwoKICAvKiBXZSBuZWVkIHRvIHByb3ZpZGUgZm9yIHZlY3Rv ciBwb2ludGVycywgdmVjdG9yIGFycmF5cywgYW5kCiAgICAgZnVuY3Rpb25z IHJldHVybmluZyB2ZWN0b3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgX19h dHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2hvcnQgKmZvbzsKCiAg ICAgSW4gdGhpcyBjYXNlLCB0aGUgbW9kZSBpcyBTSSwgYnV0IHRoZSB0eXBl IGJlaW5nIG1vZGlmaWVkIGlzCiAgICAgSEksIHNvIHdlIG5lZWQgdG8gbG9v ayBmdXJ0aGVyLiAgKi8KCiAgd2hpbGUgKFBPSU5URVJfVFlQRV9QICh0eXBl KQoJIHx8IFRSRUVfQ09ERSAodHlwZSkgPT0gRlVOQ1RJT05fVFlQRQoJIHx8 IFRSRUVfQ09ERSAodHlwZSkgPT0gTUVUSE9EX1RZUEUKCSB8fCBUUkVFX0NP REUgKHR5cGUpID09IEFSUkFZX1RZUEUpCiAgICB0eXBlID0gVFJFRV9UWVBF ICh0eXBlKTsKCiAgLyogR2V0IHRoZSBtb2RlIG9mIHRoZSB0eXBlIGJlaW5n IG1vZGlmaWVkLiAgKi8KICBvcmlnX21vZGUgPSBUWVBFX01PREUgKHR5cGUp OwoKICBpZiAoVFJFRV9DT0RFICh0eXBlKSA9PSBSRUNPUkRfVFlQRQogICAg ICB8fCBUUkVFX0NPREUgKHR5cGUpID09IFVOSU9OX1RZUEUKICAgICAgfHwg VFJFRV9DT0RFICh0eXBlKSA9PSBWRUNUT1JfVFlQRQogICAgICB8fCAoIVND QUxBUl9GTE9BVF9NT0RFX1AgKG9yaWdfbW9kZSkKCSAgJiYgR0VUX01PREVf Q0xBU1MgKG9yaWdfbW9kZSkgIT0gTU9ERV9JTlQKCSAgJiYgIUFMTF9TQ0FM QVJfRklYRURfUE9JTlRfTU9ERV9QIChvcmlnX21vZGUpKQogICAgICB8fCAh aG9zdF9pbnRlZ2VycCAoVFlQRV9TSVpFX1VOSVQgKHR5cGUpLCAxKSkKICAg IHsKICAgICAgZXJyb3IgKCJpbnZhbGlkIHZlY3RvciB0eXBlIGZvciBhdHRy aWJ1dGUgJXFFIiwgbmFtZSk7CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAg ICB9CgogIGlmICh2ZWNzaXplICUgdHJlZV9sb3dfY3N0IChUWVBFX1NJWkVf VU5JVCAodHlwZSksIDEpKQogICAgewogICAgICBlcnJvciAoInZlY3RvciBz aXplIG5vdCBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiBjb21wb25lbnQgc2l6 ZSIpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgaWYgKHZlY3NpemUg PT0gMCkKICAgIHsKICAgICAgZXJyb3IgKCJ6ZXJvIHZlY3RvciBzaXplIik7 CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAvKiBDYWxjdWxhdGUgaG93 IG1hbnkgdW5pdHMgZml0IGluIHRoZSB2ZWN0b3IuICAqLwogIG51bml0cyA9 IHZlY3NpemUgLyB0cmVlX2xvd19jc3QgKFRZUEVfU0laRV9VTklUICh0eXBl KSwgMSk7CiAgaWYgKG51bml0cyAmIChudW5pdHMgLSAxKSkKICAgIHsKICAg ICAgZXJyb3IgKCJudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgdmVjdG9y IG5vdCBhIHBvd2VyIG9mIHR3byIpOwogICAgICByZXR1cm4gTlVMTF9UUkVF OwogICAgfQoKICBuZXdfdHlwZSA9IGJ1aWxkX3ZlY3Rvcl90eXBlICh0eXBl LCBudW5pdHMpOwoKICAvKiBCdWlsZCBiYWNrIHBvaW50ZXJzIGlmIG5lZWRl ZC4gICovCiAgKm5vZGUgPSByZWNvbnN0cnVjdF9jb21wbGV4X3R5cGUgKCpu b2RlLCBuZXdfdHlwZSk7CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhh bmRsZSB0aGUgIm5vbm51bGwiIGF0dHJpYnV0ZS4gICovCnN0YXRpYyB0cmVl CmhhbmRsZV9ub25udWxsX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBB UkdfVU5VU0VEIChuYW1lKSwKCQkJICB0cmVlIGFyZ3MsIGludCBBUkdfVU5V U0VEIChmbGFncyksCgkJCSAgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJl ZSB0eXBlID0gKm5vZGU7CiAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBhdHRy X2FyZ19udW07CgogIC8qIElmIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVk LCBhbGwgcG9pbnRlciBhcmd1bWVudHMgc2hvdWxkIGJlCiAgICAgbm9uLW51 bGwuICBWZXJpZnkgYSBmdWxsIHByb3RvdHlwZSBpcyBnaXZlbiBzbyB0aGF0 IHRoZSBhcmd1bWVudHMKICAgICB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgdHlw ZXMgd2hlbiB3ZSBhY3R1YWxseSBjaGVjayB0aGVtIGxhdGVyLiAgKi8KICBp ZiAoIWFyZ3MpCiAgICB7CiAgICAgIGlmICghVFlQRV9BUkdfVFlQRVMgKHR5 cGUpKQoJewoJICBlcnJvciAoIm5vbm51bGwgYXR0cmlidXRlIHdpdGhvdXQg YXJndW1lbnRzIG9uIGEgbm9uLXByb3RvdHlwZSIpOwoJICAqbm9fYWRkX2F0 dHJzID0gdHJ1ZTsKCX0KICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0K CiAgLyogQXJndW1lbnQgbGlzdCBzcGVjaWZpZWQuICBWZXJpZnkgdGhhdCBl YWNoIGFyZ3VtZW50IG51bWJlciByZWZlcmVuY2VzCiAgICAgYSBwb2ludGVy IGFyZ3VtZW50LiAgKi8KICBmb3IgKGF0dHJfYXJnX251bSA9IDE7IGFyZ3M7 IGFyZ3MgPSBUUkVFX0NIQUlOIChhcmdzKSkKICAgIHsKICAgICAgdHJlZSBh cmd1bWVudDsKICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBhcmdfbnVt ID0gMCwgY2tfbnVtOwoKICAgICAgaWYgKCFnZXRfbm9ubnVsbF9vcGVyYW5k IChUUkVFX1ZBTFVFIChhcmdzKSwgJmFyZ19udW0pKQoJewoJICBlcnJvciAo Im5vbm51bGwgYXJndW1lbnQgaGFzIGludmFsaWQgb3BlcmFuZCBudW1iZXIg KGFyZ3VtZW50ICVsdSkiLAoJCSAodW5zaWduZWQgbG9uZykgYXR0cl9hcmdf bnVtKTsKCSAgKm5vX2FkZF9hdHRycyA9IHRydWU7CgkgIHJldHVybiBOVUxM X1RSRUU7Cgl9CgogICAgICBhcmd1bWVudCA9IFRZUEVfQVJHX1RZUEVTICh0 eXBlKTsKICAgICAgaWYgKGFyZ3VtZW50KQoJewoJICBmb3IgKGNrX251bSA9 IDE7IDsgY2tfbnVtKyspCgkgICAgewoJICAgICAgaWYgKCFhcmd1bWVudCB8 fCBja19udW0gPT0gYXJnX251bSkKCQlicmVhazsKCSAgICAgIGFyZ3VtZW50 ID0gVFJFRV9DSEFJTiAoYXJndW1lbnQpOwoJICAgIH0KCgkgIGlmICghYXJn dW1lbnQKCSAgICAgIHx8IFRSRUVfQ09ERSAoVFJFRV9WQUxVRSAoYXJndW1l bnQpKSA9PSBWT0lEX1RZUEUpCgkgICAgewoJICAgICAgZXJyb3IgKCJub25u dWxsIGFyZ3VtZW50IHdpdGggb3V0LW9mLXJhbmdlIG9wZXJhbmQgbnVtYmVy IChhcmd1bWVudCAlbHUsIG9wZXJhbmQgJWx1KSIsCgkJICAgICAodW5zaWdu ZWQgbG9uZykgYXR0cl9hcmdfbnVtLCAodW5zaWduZWQgbG9uZykgYXJnX251 bSk7CgkgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAgICAgIHJldHVy biBOVUxMX1RSRUU7CgkgICAgfQoKCSAgaWYgKFRSRUVfQ09ERSAoVFJFRV9W QUxVRSAoYXJndW1lbnQpKSAhPSBQT0lOVEVSX1RZUEUpCgkgICAgewoJICAg ICAgZXJyb3IgKCJub25udWxsIGFyZ3VtZW50IHJlZmVyZW5jZXMgbm9uLXBv aW50ZXIgb3BlcmFuZCAoYXJndW1lbnQgJWx1LCBvcGVyYW5kICVsdSkiLAoJ CSAgICh1bnNpZ25lZCBsb25nKSBhdHRyX2FyZ19udW0sICh1bnNpZ25lZCBs b25nKSBhcmdfbnVtKTsKCSAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwoJ ICAgICAgcmV0dXJuIE5VTExfVFJFRTsKCSAgICB9Cgl9CiAgICB9CgogIHJl dHVybiBOVUxMX1RSRUU7Cn0KCi8qIENoZWNrIHRoZSBhcmd1bWVudCBsaXN0 IG9mIGEgZnVuY3Rpb24gY2FsbCBmb3IgbnVsbCBpbiBhcmd1bWVudCBzbG90 cwogICB0aGF0IGFyZSBtYXJrZWQgYXMgcmVxdWlyaW5nIGEgbm9uLW51bGwg cG9pbnRlciBhcmd1bWVudC4gIFRoZSBOQVJHUwogICBhcmd1bWVudHMgYXJl IHBhc3NlZCBpbiB0aGUgYXJyYXkgQVJHQVJSQVkuCiovCgpzdGF0aWMgdm9p ZApjaGVja19mdW5jdGlvbl9ub25udWxsICh0cmVlIGF0dHJzLCBpbnQgbmFy Z3MsIHRyZWUgKmFyZ2FycmF5KQp7CiAgdHJlZSBhLCBhcmdzOwogIGludCBp OwoKICBmb3IgKGEgPSBhdHRyczsgYTsgYSA9IFRSRUVfQ0hBSU4gKGEpKQog ICAgewogICAgICBpZiAoaXNfYXR0cmlidXRlX3AgKCJub25udWxsIiwgVFJF RV9QVVJQT1NFIChhKSkpCgl7CgkgIGFyZ3MgPSBUUkVFX1ZBTFVFIChhKTsK CgkgIC8qIFdhbGsgdGhlIGFyZ3VtZW50IGxpc3QuICBJZiB3ZSBlbmNvdW50 ZXIgYW4gYXJndW1lbnQgbnVtYmVyIHdlCgkgICAgIHNob3VsZCBjaGVjayBm b3Igbm9uLW51bGwsIGRvIGl0LiAgSWYgdGhlIGF0dHJpYnV0ZSBoYXMgbm8g YXJncywKCSAgICAgdGhlbiBldmVyeSBwb2ludGVyIGFyZ3VtZW50IGlzIGNo ZWNrZWQgKGluIHdoaWNoIGNhc2UgdGhlIGNoZWNrCgkgICAgIGZvciBwb2lu dGVyIHR5cGUgaXMgZG9uZSBpbiBjaGVja19ub25udWxsX2FyZykuICAqLwoJ ICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKCSAgICB7CgkgICAgICBp ZiAoIWFyZ3MgfHwgbm9ubnVsbF9jaGVja19wIChhcmdzLCBpICsgMSkpCgkJ Y2hlY2tfZnVuY3Rpb25fYXJndW1lbnRzX3JlY3Vyc2UgKGNoZWNrX25vbm51 bGxfYXJnLCBOVUxMLAoJCQkJCQkgIGFyZ2FycmF5W2ldLAoJCQkJCQkgIGkg KyAxKTsKCSAgICB9Cgl9CiAgICB9Cn0KCi8qIENoZWNrIHRoYXQgdGhlIE50 aCBhcmd1bWVudCBvZiBhIGZ1bmN0aW9uIGNhbGwgKGNvdW50aW5nIGJhY2t3 YXJkcwogICBmcm9tIHRoZSBlbmQpIGlzIGEgKHBvaW50ZXIpMC4gIFRoZSBO QVJHUyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiB0aGUKICAgYXJyYXkgQVJH QVJSQVkuICAqLwoKc3RhdGljIHZvaWQKY2hlY2tfZnVuY3Rpb25fc2VudGlu ZWwgKHRyZWUgYXR0cnMsIGludCBuYXJncywgdHJlZSAqYXJnYXJyYXksIHRy ZWUgdHlwZWxpc3QpCnsKICB0cmVlIGF0dHIgPSBsb29rdXBfYXR0cmlidXRl ICgic2VudGluZWwiLCBhdHRycyk7CgogIGlmIChhdHRyKQogICAgewogICAg ICBpbnQgbGVuID0gMDsKICAgICAgaW50IHBvcyA9IDA7CiAgICAgIHRyZWUg c2VudGluZWw7CgogICAgICAvKiBTa2lwIG92ZXIgdGhlIG5hbWVkIGFyZ3Vt ZW50cy4gICovCiAgICAgIHdoaWxlICh0eXBlbGlzdCAmJiBsZW4gPCBuYXJn cykKCXsKCSAgdHlwZWxpc3QgPSBUUkVFX0NIQUlOICh0eXBlbGlzdCk7Cgkg IGxlbisrOwoJfQoKICAgICAgaWYgKFRSRUVfVkFMVUUgKGF0dHIpKQoJewoJ ICB0cmVlIHAgPSBUUkVFX1ZBTFVFIChUUkVFX1ZBTFVFIChhdHRyKSk7Cgkg IHBvcyA9IFRSRUVfSU5UX0NTVF9MT1cgKHApOwoJfQoKICAgICAgLyogVGhl IHNlbnRpbmVsIG11c3QgYmUgb25lIG9mIHRoZSB2YXJhcmdzLCBpLmUuCgkg aW4gcG9zaXRpb24gPj0gdGhlIG51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMu ICAqLwogICAgICBpZiAoKG5hcmdzIC0gMSAtIHBvcykgPCBsZW4pCgl7Cgkg IHdhcm5pbmcgKE9QVF9XZm9ybWF0LAoJCSAgICJub3QgZW5vdWdoIHZhcmlh YmxlIGFyZ3VtZW50cyB0byBmaXQgYSBzZW50aW5lbCIpOwoJICByZXR1cm47 Cgl9CgogICAgICAvKiBWYWxpZGF0ZSB0aGUgc2VudGluZWwuICAqLwogICAg ICBzZW50aW5lbCA9IGFyZ2FycmF5W25hcmdzIC0gMSAtIHBvc107CiAgICAg IGlmICgoIVBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKHNlbnRpbmVsKSkK CSAgIHx8ICFpbnRlZ2VyX3plcm9wIChzZW50aW5lbCkpCgkgIC8qIEFsdGhv dWdoIF9fbnVsbCAoaW4gQysrKSBpcyBvbmx5IGFuIGludGVnZXIgd2UgYWxs b3cgaXQKCSAgICAgbmV2ZXJ0aGVsZXNzLCBhcyB3ZSBhcmUgZ3VhcmFudGVl ZCB0aGF0IGl0J3MgZXhhY3RseQoJICAgICBhcyB3aWRlIGFzIGEgcG9pbnRl ciwgYW5kIHdlIGRvbid0IHdhbnQgdG8gZm9yY2UKCSAgICAgdXNlcnMgdG8g Y2FzdCB0aGUgTlVMTCB0aGV5IGhhdmUgd3JpdHRlbiB0aGVyZS4KCSAgICAg V2Ugd2FybiB3aXRoIC1Xc3RyaWN0LW51bGwtc2VudGluZWwsIHRob3VnaC4g ICovCgkgICYmICh3YXJuX3N0cmljdF9udWxsX3NlbnRpbmVsIHx8IG51bGxf bm9kZSAhPSBzZW50aW5lbCkpCgl3YXJuaW5nIChPUFRfV2Zvcm1hdCwgIm1p c3Npbmcgc2VudGluZWwgaW4gZnVuY3Rpb24gY2FsbCIpOwogICAgfQp9Cgov KiBIZWxwZXIgZm9yIGNoZWNrX2Z1bmN0aW9uX25vbm51bGw7IGdpdmVuIGEg bGlzdCBvZiBvcGVyYW5kcyB3aGljaAogICBtdXN0IGJlIG5vbi1udWxsIGlu IEFSR1MsIGRldGVybWluZSBpZiBvcGVyYW5kIFBBUkFNX05VTSBzaG91bGQg YmUKICAgY2hlY2tlZC4gICovCgpzdGF0aWMgYm9vbApub25udWxsX2NoZWNr X3AgKHRyZWUgYXJncywgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBwYXJhbV9u dW0pCnsKICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGFyZ19udW0gPSAwOwoK ICBmb3IgKDsgYXJnczsgYXJncyA9IFRSRUVfQ0hBSU4gKGFyZ3MpKQogICAg ewogICAgICBib29sIGZvdW5kID0gZ2V0X25vbm51bGxfb3BlcmFuZCAoVFJF RV9WQUxVRSAoYXJncyksICZhcmdfbnVtKTsKCiAgICAgIGdjY19hc3NlcnQg KGZvdW5kKTsKCiAgICAgIGlmIChhcmdfbnVtID09IHBhcmFtX251bSkKCXJl dHVybiB0cnVlOwogICAgfQogIHJldHVybiBmYWxzZTsKfQoKLyogQ2hlY2sg dGhhdCB0aGUgZnVuY3Rpb24gYXJndW1lbnQgUEFSQU0gKHdoaWNoIGlzIG9w ZXJhbmQgbnVtYmVyCiAgIFBBUkFNX05VTSkgaXMgbm9uLW51bGwuICBUaGlz IGlzIGNhbGxlZCBieSBjaGVja19mdW5jdGlvbl9ub25udWxsCiAgIHZpYSBj aGVja19mdW5jdGlvbl9hcmd1bWVudHNfcmVjdXJzZS4gICovCgpzdGF0aWMg dm9pZApjaGVja19ub25udWxsX2FyZyAodm9pZCAqIEFSR19VTlVTRUQgKGN0 eCksIHRyZWUgcGFyYW0sCgkJICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBw YXJhbV9udW0pCnsKICAvKiBKdXN0IHNraXAgY2hlY2tpbmcgdGhlIGFyZ3Vt ZW50IGlmIGl0J3Mgbm90IGEgcG9pbnRlci4gIFRoaXMgY2FuCiAgICAgaGFw cGVuIGlmIHRoZSAibm9ubnVsbCIgYXR0cmlidXRlIHdhcyBnaXZlbiB3aXRo b3V0IGFuIG9wZXJhbmQKICAgICBsaXN0ICh3aGljaCBtZWFucyB0byBjaGVj ayBldmVyeSBwb2ludGVyIGFyZ3VtZW50KS4gICovCgogIGlmIChUUkVFX0NP REUgKFRSRUVfVFlQRSAocGFyYW0pKSAhPSBQT0lOVEVSX1RZUEUpCiAgICBy ZXR1cm47CgogIGlmIChpbnRlZ2VyX3plcm9wIChwYXJhbSkpCiAgICB3YXJu aW5nIChPUFRfV25vbm51bGwsICJudWxsIGFyZ3VtZW50IHdoZXJlIG5vbi1u dWxsIHJlcXVpcmVkICIKCSAgICAgIihhcmd1bWVudCAlbHUpIiwgKHVuc2ln bmVkIGxvbmcpIHBhcmFtX251bSk7Cn0KCi8qIEhlbHBlciBmb3Igbm9ubnVs bCBhdHRyaWJ1dGUgaGFuZGxpbmc7IGZldGNoIHRoZSBvcGVyYW5kIG51bWJl cgogICBmcm9tIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnQgbGlzdC4gICovCgpz dGF0aWMgYm9vbApnZXRfbm9ubnVsbF9vcGVyYW5kICh0cmVlIGFyZ19udW1f ZXhwciwgdW5zaWduZWQgSE9TVF9XSURFX0lOVCAqdmFscCkKewogIC8qIFZl cmlmeSB0aGUgYXJnIG51bWJlciBpcyBhIGNvbnN0YW50LiAgKi8KICBpZiAo VFJFRV9DT0RFIChhcmdfbnVtX2V4cHIpICE9IElOVEVHRVJfQ1NUCiAgICAg IHx8IFRSRUVfSU5UX0NTVF9ISUdIIChhcmdfbnVtX2V4cHIpICE9IDApCiAg ICByZXR1cm4gZmFsc2U7CgogICp2YWxwID0gVFJFRV9JTlRfQ1NUX0xPVyAo YXJnX251bV9leHByKTsKICByZXR1cm4gdHJ1ZTsKfQoKLyogSGFuZGxlIGEg Im5vdGhyb3ciIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVj dCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhh bmRsZV9ub3Rocm93X2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1l LCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkgIGludCBBUkdfVU5VU0VE IChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykKewogIGlmIChUUkVFX0NP REUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKQogICAgVFJFRV9OT1RIUk9X ICgqbm9kZSkgPSAxOwogIC8qID8/PyBUT0RPOiBTdXBwb3J0IHR5cGVzLiAg Ki8KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgImNsZWFudXAiIGF0dHJpYnV0ZTsgYXJndW1lbnRz IGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8K CnN0YXRpYyB0cmVlCmhhbmRsZV9jbGVhbnVwX2F0dHJpYnV0ZSAodHJlZSAq bm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MsCgkJCSAgaW50IEFSR19VTlVT RUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNs ID0gKm5vZGU7CiAgdHJlZSBjbGVhbnVwX2lkLCBjbGVhbnVwX2RlY2w7Cgog IC8qID8/PyBDb3VsZCBwZXJoYXBzIHN1cHBvcnQgY2xlYW51cHMgb24gVFJF RV9TVEFUSUMsIG11Y2ggbGlrZSB3ZSBkbwogICAgIGZvciBnbG9iYWwgZGVz dHJ1Y3RvcnMgaW4gQysrLiAgVGhpcyByZXF1aXJlcyBpbmZyYXN0cnVjdHVy ZSB0aGF0CiAgICAgd2UgZG9uJ3QgaGF2ZSBnZW5lcmljYWxseSBhdCB0aGUg bW9tZW50LiAgSXQncyBhbHNvIG5vdCBhIGZlYXR1cmUKICAgICB3ZSdkIGJl IG1pc3NpbmcgdG9vIG11Y2gsIHNpbmNlIHdlIGRvIGhhdmUgYXR0cmlidXRl IGNvbnN0cnVjdG9yLiAgKi8KICBpZiAoVFJFRV9DT0RFIChkZWNsKSAhPSBW QVJfREVDTCB8fCBUUkVFX1NUQVRJQyAoZGVjbCkpCiAgICB7CiAgICAgIHdh cm5pbmcgKE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3Jl ZCIsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgICAg cmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiAgLyogVmVyaWZ5IHRoYXQgdGhl IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gaW4gc2NvcGUuICAqLwogIC8qID8/ PyBXZSBjb3VsZCBzdXBwb3J0IHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBoZXJl IGFzIHdlbGwsIGlmCiAgICAgdGhhdCB3YXMgY29uc2lkZXJlZCBkZXNpcmFi bGUuICAqLwogIGNsZWFudXBfaWQgPSBUUkVFX1ZBTFVFIChhcmdzKTsKICBp ZiAoVFJFRV9DT0RFIChjbGVhbnVwX2lkKSAhPSBJREVOVElGSUVSX05PREUp CiAgICB7CiAgICAgIGVycm9yICgiY2xlYW51cCBhcmd1bWVudCBub3QgYW4g aWRlbnRpZmllciIpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAg ICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KICBjbGVhbnVwX2RlY2wgPSBs b29rdXBfbmFtZSAoY2xlYW51cF9pZCk7CiAgaWYgKCFjbGVhbnVwX2RlY2wg fHwgVFJFRV9DT0RFIChjbGVhbnVwX2RlY2wpICE9IEZVTkNUSU9OX0RFQ0wp CiAgICB7CiAgICAgIGVycm9yICgiY2xlYW51cCBhcmd1bWVudCBub3QgYSBm dW5jdGlvbiIpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgICAg cmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiAgLyogVGhhdCB0aGUgZnVuY3Rp b24gaGFzIHByb3BlciB0eXBlIGlzIGNoZWNrZWQgd2l0aCB0aGUKICAgICBl dmVudHVhbCBjYWxsIHRvIGJ1aWxkX2Z1bmN0aW9uX2NhbGwuICAqLwoKICBy ZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAid2Fybl91bnVzZWRf cmVzdWx0IiBhdHRyaWJ1dGUuICBObyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8K CnN0YXRpYyB0cmVlCmhhbmRsZV93YXJuX3VudXNlZF9yZXN1bHRfYXR0cmli dXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJCSAgICAgICB0cmVlIEFS R19VTlVTRUQgKGFyZ3MpLAoJCQkgICAgICAgaW50IEFSR19VTlVTRUQgKGZs YWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgLyogSWdub3JlIHRoZSBh dHRyaWJ1dGUgZm9yIGZ1bmN0aW9ucyBub3QgcmV0dXJuaW5nIGFueSB2YWx1 ZS4gICovCiAgaWYgKFZPSURfVFlQRV9QIChUUkVFX1RZUEUgKCpub2RlKSkp CiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywgIiVxRSBh dHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJz ID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFu ZGxlIGEgInNlbnRpbmVsIiBhdHRyaWJ1dGUuICAqLwoKc3RhdGljIHRyZWUK aGFuZGxlX3NlbnRpbmVsX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBu YW1lLCB0cmVlIGFyZ3MsCgkJCSAgIGludCBBUkdfVU5VU0VEIChmbGFncyks IGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUgcGFyYW1zID0gVFlQRV9B UkdfVFlQRVMgKCpub2RlKTsKCiAgaWYgKCFwYXJhbXMpCiAgICB7CiAgICAg IHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywKCSAgICAgICAiJXFFIGF0dHJp YnV0ZSByZXF1aXJlcyBwcm90b3R5cGVzIHdpdGggbmFtZWQgYXJndW1lbnRz IiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQog IGVsc2UKICAgIHsKICAgICAgd2hpbGUgKFRSRUVfQ0hBSU4gKHBhcmFtcykp CglwYXJhbXMgPSBUUkVFX0NIQUlOIChwYXJhbXMpOwoKICAgICAgaWYgKFZP SURfVFlQRV9QIChUUkVFX1ZBTFVFIChwYXJhbXMpKSkKCXsKCSAgd2Fybmlu ZyAoT1BUX1dhdHRyaWJ1dGVzLAoJCSAgICIlcUUgYXR0cmlidXRlIG9ubHkg YXBwbGllcyB0byB2YXJpYWRpYyBmdW5jdGlvbnMiLCBuYW1lKTsKCSAgKm5v X2FkZF9hdHRycyA9IHRydWU7Cgl9CiAgICB9CgogIGlmIChhcmdzKQogICAg ewogICAgICB0cmVlIHBvc2l0aW9uID0gVFJFRV9WQUxVRSAoYXJncyk7Cgog ICAgICBpZiAoVFJFRV9DT0RFIChwb3NpdGlvbikgIT0gSU5URUdFUl9DU1Qp Cgl7CgkgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywgCgkJICAgInJlcXVl c3RlZCBwb3NpdGlvbiBpcyBub3QgYW4gaW50ZWdlciBjb25zdGFudCIpOwoJ ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCX0KICAgICAgZWxzZQoJewoJICBp ZiAodHJlZV9pbnRfY3N0X2x0IChwb3NpdGlvbiwgaW50ZWdlcl96ZXJvX25v ZGUpKQoJICAgIHsKCSAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywK CQkgICAgICAgInJlcXVlc3RlZCBwb3NpdGlvbiBpcyBsZXNzIHRoYW4gemVy byIpOwoJICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CgkgICAgfQoJfQog ICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAidHlw ZV9nZW5lcmljIiBhdHRyaWJ1dGUuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxl X3R5cGVfZ2VuZXJpY19hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgQVJH X1VOVVNFRCAobmFtZSksCgkJCSAgICAgICB0cmVlIEFSR19VTlVTRUQgKGFy Z3MpLCBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkgICAgICAgYm9vbCAq IEFSR19VTlVTRUQgKG5vX2FkZF9hdHRycykpCnsKICAvKiBFbnN1cmUgd2Ug aGF2ZSBhIGZ1bmN0aW9uIHR5cGUsIHdpdGggbm8gYXJndW1lbnRzLiAgKi8K ICBnY2NfYXNzZXJ0IChUUkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9U WVBFICYmICEgVFlQRV9BUkdfVFlQRVMgKCpub2RlKSk7CgogIHJldHVybiBO VUxMX1RSRUU7Cn0KDAovKiBDaGVjayBmb3IgdmFsaWQgYXJndW1lbnRzIGJl aW5nIHBhc3NlZCB0byBhIGZ1bmN0aW9uLgogICBBVFRSUyBpcyBhIGxpc3Qg b2YgYXR0cmlidXRlcy4gIFRoZXJlIGFyZSBOQVJHUyBhcmd1bWVudHMgaW4g dGhlIGFycmF5CiAgIEFSR0FSUkFZLiAgVFlQRUxJU1QgaXMgdGhlIGxpc3Qg b2YgYXJndW1lbnQgdHlwZXMgZm9yIHRoZSBmdW5jdGlvbi4KICovCnZvaWQK Y2hlY2tfZnVuY3Rpb25fYXJndW1lbnRzICh0cmVlIGF0dHJzLCBpbnQgbmFy Z3MsIHRyZWUgKmFyZ2FycmF5LCB0cmVlIHR5cGVsaXN0KQp7CiAgLyogQ2hl Y2sgZm9yIG51bGwgYmVpbmcgcGFzc2VkIGluIGEgcG9pbnRlciBhcmd1bWVu dCB0aGF0IG11c3QgYmUKICAgICBub24tbnVsbC4gIFdlIGFsc28gbmVlZCB0 byBkbyB0aGlzIGlmIGZvcm1hdCBjaGVja2luZyBpcyBlbmFibGVkLiAgKi8K CiAgaWYgKHdhcm5fbm9ubnVsbCkKICAgIGNoZWNrX2Z1bmN0aW9uX25vbm51 bGwgKGF0dHJzLCBuYXJncywgYXJnYXJyYXkpOwoKICAvKiBDaGVjayBmb3Ig ZXJyb3JzIGluIGZvcm1hdCBzdHJpbmdzLiAgKi8KCiAgaWYgKHdhcm5fZm9y bWF0IHx8IHdhcm5fbWlzc2luZ19mb3JtYXRfYXR0cmlidXRlKQogICAgY2hl Y2tfZnVuY3Rpb25fZm9ybWF0IChhdHRycywgbmFyZ3MsIGFyZ2FycmF5KTsK CiAgaWYgKHdhcm5fZm9ybWF0KQogICAgY2hlY2tfZnVuY3Rpb25fc2VudGlu ZWwgKGF0dHJzLCBuYXJncywgYXJnYXJyYXksIHR5cGVsaXN0KTsKfQoKLyog R2VuZXJpYyBhcmd1bWVudCBjaGVja2luZyByZWN1cnNpb24gcm91dGluZS4g IFBBUkFNIGlzIHRoZSBhcmd1bWVudCB0bwogICBiZSBjaGVja2VkLiAgUEFS QU1fTlVNIGlzIHRoZSBudW1iZXIgb2YgdGhlIGFyZ3VtZW50LiAgQ0FMTEJB Q0sgaXMgaW52b2tlZAogICBvbmNlIHRoZSBhcmd1bWVudCBpcyByZXNvbHZl ZC4gIENUWCBpcyBjb250ZXh0IGZvciB0aGUgY2FsbGJhY2suICAqLwp2b2lk CmNoZWNrX2Z1bmN0aW9uX2FyZ3VtZW50c19yZWN1cnNlICh2b2lkICgqY2Fs bGJhY2spCgkJCQkgICh2b2lkICosIHRyZWUsIHVuc2lnbmVkIEhPU1RfV0lE RV9JTlQpLAoJCQkJICB2b2lkICpjdHgsIHRyZWUgcGFyYW0sCgkJCQkgIHVu c2lnbmVkIEhPU1RfV0lERV9JTlQgcGFyYW1fbnVtKQp7CiAgaWYgKChUUkVF X0NPREUgKHBhcmFtKSA9PSBOT1BfRVhQUiB8fCBUUkVFX0NPREUgKHBhcmFt KSA9PSBDT05WRVJUX0VYUFIpCiAgICAgICYmIChUWVBFX1BSRUNJU0lPTiAo VFJFRV9UWVBFIChwYXJhbSkpCgkgID09IFRZUEVfUFJFQ0lTSU9OIChUUkVF X1RZUEUgKFRSRUVfT1BFUkFORCAocGFyYW0sIDApKSkpKQogICAgewogICAg ICAvKiBTdHJpcCBjb2VyY2lvbi4gICovCiAgICAgIGNoZWNrX2Z1bmN0aW9u X2FyZ3VtZW50c19yZWN1cnNlIChjYWxsYmFjaywgY3R4LAoJCQkJCVRSRUVf T1BFUkFORCAocGFyYW0sIDApLCBwYXJhbV9udW0pOwogICAgICByZXR1cm47 CiAgICB9CgogIGlmIChUUkVFX0NPREUgKHBhcmFtKSA9PSBDQUxMX0VYUFIp CiAgICB7CiAgICAgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoVFJFRV9UWVBF IChDQUxMX0VYUFJfRk4gKHBhcmFtKSkpOwogICAgICB0cmVlIGF0dHJzOwog ICAgICBib29sIGZvdW5kX2Zvcm1hdF9hcmcgPSBmYWxzZTsKCiAgICAgIC8q IFNlZSBpZiB0aGlzIGlzIGEgY2FsbCB0byBhIGtub3duIGludGVybmF0aW9u YWxpemF0aW9uIGZ1bmN0aW9uCgkgdGhhdCBtb2RpZmllcyBhIGZvcm1hdCBh cmcuICBTdWNoIGEgZnVuY3Rpb24gbWF5IGhhdmUgbXVsdGlwbGUKCSBmb3Jt YXRfYXJnIGF0dHJpYnV0ZXMgKGZvciBleGFtcGxlLCBuZ2V0dGV4dCkuICAq LwoKICAgICAgZm9yIChhdHRycyA9IFRZUEVfQVRUUklCVVRFUyAodHlwZSk7 CgkgICBhdHRyczsKCSAgIGF0dHJzID0gVFJFRV9DSEFJTiAoYXR0cnMpKQoJ aWYgKGlzX2F0dHJpYnV0ZV9wICgiZm9ybWF0X2FyZyIsIFRSRUVfUFVSUE9T RSAoYXR0cnMpKSkKCSAgewoJICAgIHRyZWUgaW5uZXJfYXJnOwoJICAgIHRy ZWUgZm9ybWF0X251bV9leHByOwoJICAgIGludCBmb3JtYXRfbnVtOwoJICAg IGludCBpOwoJICAgIGNhbGxfZXhwcl9hcmdfaXRlcmF0b3IgaXRlcjsKCgkg ICAgLyogRXh0cmFjdCB0aGUgYXJndW1lbnQgbnVtYmVyLCB3aGljaCB3YXMg cHJldmlvdXNseSBjaGVja2VkCgkgICAgICAgdG8gYmUgdmFsaWQuICAqLwoJ ICAgIGZvcm1hdF9udW1fZXhwciA9IFRSRUVfVkFMVUUgKFRSRUVfVkFMVUUg KGF0dHJzKSk7CgoJICAgIGdjY19hc3NlcnQgKFRSRUVfQ09ERSAoZm9ybWF0 X251bV9leHByKSA9PSBJTlRFR0VSX0NTVAoJCQkmJiAhVFJFRV9JTlRfQ1NU X0hJR0ggKGZvcm1hdF9udW1fZXhwcikpOwoKCSAgICBmb3JtYXRfbnVtID0g VFJFRV9JTlRfQ1NUX0xPVyAoZm9ybWF0X251bV9leHByKTsKCgkgICAgZm9y IChpbm5lcl9hcmcgPSBmaXJzdF9jYWxsX2V4cHJfYXJnIChwYXJhbSwgJml0 ZXIpLCBpID0gMTsKCQkgaW5uZXJfYXJnICE9IDA7CgkJIGlubmVyX2FyZyA9 IG5leHRfY2FsbF9leHByX2FyZyAoJml0ZXIpLCBpKyspCgkgICAgICBpZiAo aSA9PSBmb3JtYXRfbnVtKQoJCXsKCQkgIGNoZWNrX2Z1bmN0aW9uX2FyZ3Vt ZW50c19yZWN1cnNlIChjYWxsYmFjaywgY3R4LAoJCQkJCQkgICAgaW5uZXJf YXJnLCBwYXJhbV9udW0pOwoJCSAgZm91bmRfZm9ybWF0X2FyZyA9IHRydWU7 CgkJICBicmVhazsKCQl9CgkgIH0KCiAgICAgIC8qIElmIHdlIGZvdW5kIGEg Zm9ybWF0X2FyZyBhdHRyaWJ1dGUgYW5kIGRpZCBhIHJlY3Vyc2l2ZSBjaGVj aywKCSB3ZSBhcmUgZG9uZSB3aXRoIGNoZWNraW5nIHRoaXMgYXJndW1lbnQu ICBPdGhlcndpc2UsIHdlIGNvbnRpbnVlCgkgYW5kIHRoaXMgd2lsbCBiZSBj b25zaWRlcmVkIGEgbm9uLWxpdGVyYWwuICAqLwogICAgICBpZiAoZm91bmRf Zm9ybWF0X2FyZykKCXJldHVybjsKICAgIH0KCiAgaWYgKFRSRUVfQ09ERSAo cGFyYW0pID09IENPTkRfRVhQUikKICAgIHsKICAgICAgLyogQ2hlY2sgYm90 aCBoYWx2ZXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uICAqLwog ICAgICBjaGVja19mdW5jdGlvbl9hcmd1bWVudHNfcmVjdXJzZSAoY2FsbGJh Y2ssIGN0eCwKCQkJCQlUUkVFX09QRVJBTkQgKHBhcmFtLCAxKSwgcGFyYW1f bnVtKTsKICAgICAgY2hlY2tfZnVuY3Rpb25fYXJndW1lbnRzX3JlY3Vyc2Ug KGNhbGxiYWNrLCBjdHgsCgkJCQkJVFJFRV9PUEVSQU5EIChwYXJhbSwgMiks IHBhcmFtX251bSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgKCpjYWxsYmFj aykgKGN0eCwgcGFyYW0sIHBhcmFtX251bSk7Cn0KCi8qIEZ1bmN0aW9uIHRv IGhlbHAgcXNvcnQgc29ydCBGSUVMRF9ERUNMcyBieSBuYW1lIG9yZGVyLiAg Ki8KCmludApmaWVsZF9kZWNsX2NtcCAoY29uc3Qgdm9pZCAqeF9wLCBjb25z dCB2b2lkICp5X3ApCnsKICBjb25zdCB0cmVlICpjb25zdCB4ID0gKGNvbnN0 IHRyZWUgKmNvbnN0KSB4X3A7CiAgY29uc3QgdHJlZSAqY29uc3QgeSA9IChj b25zdCB0cmVlICpjb25zdCkgeV9wOwoKICBpZiAoREVDTF9OQU1FICgqeCkg PT0gREVDTF9OQU1FICgqeSkpCiAgICAvKiBBIG5vbnR5cGUgaXMgImdyZWF0 ZXIiIHRoYW4gYSB0eXBlLiAgKi8KICAgIHJldHVybiAoVFJFRV9DT0RFICgq eSkgPT0gVFlQRV9ERUNMKSAtIChUUkVFX0NPREUgKCp4KSA9PSBUWVBFX0RF Q0wpOwogIGlmIChERUNMX05BTUUgKCp4KSA9PSBOVUxMX1RSRUUpCiAgICBy ZXR1cm4gLTE7CiAgaWYgKERFQ0xfTkFNRSAoKnkpID09IE5VTExfVFJFRSkK ICAgIHJldHVybiAxOwogIGlmIChERUNMX05BTUUgKCp4KSA8IERFQ0xfTkFN RSAoKnkpKQogICAgcmV0dXJuIC0xOwogIHJldHVybiAxOwp9CgpzdGF0aWMg c3RydWN0IHsKICBndF9wb2ludGVyX29wZXJhdG9yIG5ld192YWx1ZTsKICB2 b2lkICpjb29raWU7Cn0gcmVzb3J0X2RhdGE7CgovKiBUaGlzIHJvdXRpbmUg Y29tcGFyZXMgdHdvIGZpZWxkcyBsaWtlIGZpZWxkX2RlY2xfY21wIGJ1dCB1 c2luZyB0aGUKcG9pbnRlciBvcGVyYXRvciBpbiByZXNvcnRfZGF0YS4gICov CgpzdGF0aWMgaW50CnJlc29ydF9maWVsZF9kZWNsX2NtcCAoY29uc3Qgdm9p ZCAqeF9wLCBjb25zdCB2b2lkICp5X3ApCnsKICBjb25zdCB0cmVlICpjb25z dCB4ID0gKGNvbnN0IHRyZWUgKmNvbnN0KSB4X3A7CiAgY29uc3QgdHJlZSAq Y29uc3QgeSA9IChjb25zdCB0cmVlICpjb25zdCkgeV9wOwoKICBpZiAoREVD TF9OQU1FICgqeCkgPT0gREVDTF9OQU1FICgqeSkpCiAgICAvKiBBIG5vbnR5 cGUgaXMgImdyZWF0ZXIiIHRoYW4gYSB0eXBlLiAgKi8KICAgIHJldHVybiAo VFJFRV9DT0RFICgqeSkgPT0gVFlQRV9ERUNMKSAtIChUUkVFX0NPREUgKCp4 KSA9PSBUWVBFX0RFQ0wpOwogIGlmIChERUNMX05BTUUgKCp4KSA9PSBOVUxM X1RSRUUpCiAgICByZXR1cm4gLTE7CiAgaWYgKERFQ0xfTkFNRSAoKnkpID09 IE5VTExfVFJFRSkKICAgIHJldHVybiAxOwogIHsKICAgIHRyZWUgZDEgPSBE RUNMX05BTUUgKCp4KTsKICAgIHRyZWUgZDIgPSBERUNMX05BTUUgKCp5KTsK ICAgIHJlc29ydF9kYXRhLm5ld192YWx1ZSAoJmQxLCByZXNvcnRfZGF0YS5j b29raWUpOwogICAgcmVzb3J0X2RhdGEubmV3X3ZhbHVlICgmZDIsIHJlc29y dF9kYXRhLmNvb2tpZSk7CiAgICBpZiAoZDEgPCBkMikKICAgICAgcmV0dXJu IC0xOwogIH0KICByZXR1cm4gMTsKfQoKLyogUmVzb3J0IERFQ0xfU09SVEVE X0ZJRUxEUyBiZWNhdXNlIHBvaW50ZXJzIGhhdmUgYmVlbiByZW9yZGVyZWQu ICAqLwoKdm9pZApyZXNvcnRfc29ydGVkX2ZpZWxkcyAodm9pZCAqb2JqLAoJ CSAgICAgIHZvaWQgKiBBUkdfVU5VU0VEIChvcmlnX29iaiksCgkJICAgICAg Z3RfcG9pbnRlcl9vcGVyYXRvciBuZXdfdmFsdWUsCgkJICAgICAgdm9pZCAq Y29va2llKQp7CiAgc3RydWN0IHNvcnRlZF9maWVsZHNfdHlwZSAqc2YgPSAo c3RydWN0IHNvcnRlZF9maWVsZHNfdHlwZSAqKSBvYmo7CiAgcmVzb3J0X2Rh dGEubmV3X3ZhbHVlID0gbmV3X3ZhbHVlOwogIHJlc29ydF9kYXRhLmNvb2tp ZSA9IGNvb2tpZTsKICBxc29ydCAoJnNmLT5lbHRzWzBdLCBzZi0+bGVuLCBz aXplb2YgKHRyZWUpLAoJIHJlc29ydF9maWVsZF9kZWNsX2NtcCk7Cn0KCi8q IFN1YnJvdXRpbmUgb2YgY19wYXJzZV9lcnJvci4KICAgUmV0dXJuIHRoZSBy ZXN1bHQgb2YgY29uY2F0ZW5hdGluZyBMSFMgYW5kIFJIUy4gUkhTIGlzIHJl YWxseQogICBhIHN0cmluZyBsaXRlcmFsLCBpdHMgZmlyc3QgY2hhcmFjdGVy IGlzIGluZGljYXRlZCBieSBSSFNfU1RBUlQgYW5kCiAgIFJIU19TSVpFIGlz IGl0cyBsZW5ndGggKGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMIGNo YXJhY3RlcikuCgogICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBk ZWxldGluZyB0aGUgcmV0dXJuZWQgcG9pbnRlci4gICovCgpzdGF0aWMgY2hh ciAqCmNhdGVuYXRlX3N0cmluZ3MgKGNvbnN0IGNoYXIgKmxocywgY29uc3Qg Y2hhciAqcmhzX3N0YXJ0LCBpbnQgcmhzX3NpemUpCnsKICBjb25zdCBpbnQg bGhzX3NpemUgPSBzdHJsZW4gKGxocyk7CiAgY2hhciAqcmVzdWx0ID0gWE5F V1ZFQyAoY2hhciwgbGhzX3NpemUgKyByaHNfc2l6ZSk7CiAgc3RybmNweSAo cmVzdWx0LCBsaHMsIGxoc19zaXplKTsKICBzdHJuY3B5IChyZXN1bHQgKyBs aHNfc2l6ZSwgcmhzX3N0YXJ0LCByaHNfc2l6ZSk7CiAgcmV0dXJuIHJlc3Vs dDsKfQoKLyogSXNzdWUgdGhlIGVycm9yIGdpdmVuIGJ5IEdNU0dJRCwgaW5k aWNhdGluZyB0aGF0IGl0IG9jY3VycmVkIGJlZm9yZQogICBUT0tFTiwgd2hp Y2ggaGFkIHRoZSBhc3NvY2lhdGVkIFZBTFVFLiAgKi8KCnZvaWQKY19wYXJz ZV9lcnJvciAoY29uc3QgY2hhciAqZ21zZ2lkLCBlbnVtIGNwcF90dHlwZSB0 b2tlbiwgdHJlZSB2YWx1ZSkKewojZGVmaW5lIGNhdGVuYXRlX21lc3NhZ2Vz KE0xLCBNMikgY2F0ZW5hdGVfc3RyaW5ncyAoKE0xKSwgKE0yKSwgc2l6ZW9m IChNMikpCgogIGNoYXIgKm1lc3NhZ2UgPSBOVUxMOwoKICBpZiAodG9rZW4g PT0gQ1BQX0VPRikKICAgIG1lc3NhZ2UgPSBjYXRlbmF0ZV9tZXNzYWdlcyAo Z21zZ2lkLCAiIGF0IGVuZCBvZiBpbnB1dCIpOwogIGVsc2UgaWYgKHRva2Vu ID09IENQUF9DSEFSIHx8IHRva2VuID09IENQUF9XQ0hBUikKICAgIHsKICAg ICAgdW5zaWduZWQgaW50IHZhbCA9IFRSRUVfSU5UX0NTVF9MT1cgKHZhbHVl KTsKICAgICAgY29uc3QgY2hhciAqY29uc3QgZWxsID0gKHRva2VuID09IENQ UF9DSEFSKSA/ICIiIDogIkwiOwogICAgICBpZiAodmFsIDw9IFVDSEFSX01B WCAmJiBJU0dSQVBIICh2YWwpKQoJbWVzc2FnZSA9IGNhdGVuYXRlX21lc3Nh Z2VzIChnbXNnaWQsICIgYmVmb3JlICVzJyVjJyIpOwogICAgICBlbHNlCglt ZXNzYWdlID0gY2F0ZW5hdGVfbWVzc2FnZXMgKGdtc2dpZCwgIiBiZWZvcmUg JXMnXFx4JXgnIik7CgogICAgICBlcnJvciAobWVzc2FnZSwgZWxsLCB2YWwp OwogICAgICBmcmVlIChtZXNzYWdlKTsKICAgICAgbWVzc2FnZSA9IE5VTEw7 CiAgICB9CiAgZWxzZSBpZiAodG9rZW4gPT0gQ1BQX1NUUklORyB8fCB0b2tl biA9PSBDUFBfV1NUUklORykKICAgIG1lc3NhZ2UgPSBjYXRlbmF0ZV9tZXNz YWdlcyAoZ21zZ2lkLCAiIGJlZm9yZSBzdHJpbmcgY29uc3RhbnQiKTsKICBl bHNlIGlmICh0b2tlbiA9PSBDUFBfTlVNQkVSKQogICAgbWVzc2FnZSA9IGNh dGVuYXRlX21lc3NhZ2VzIChnbXNnaWQsICIgYmVmb3JlIG51bWVyaWMgY29u c3RhbnQiKTsKICBlbHNlIGlmICh0b2tlbiA9PSBDUFBfTkFNRSkKICAgIHsK ICAgICAgbWVzc2FnZSA9IGNhdGVuYXRlX21lc3NhZ2VzIChnbXNnaWQsICIg YmVmb3JlICVxRSIpOwogICAgICBlcnJvciAobWVzc2FnZSwgdmFsdWUpOwog ICAgICBmcmVlIChtZXNzYWdlKTsKICAgICAgbWVzc2FnZSA9IE5VTEw7CiAg ICB9CiAgZWxzZSBpZiAodG9rZW4gPT0gQ1BQX1BSQUdNQSkKICAgIG1lc3Nh Z2UgPSBjYXRlbmF0ZV9tZXNzYWdlcyAoZ21zZ2lkLCAiIGJlZm9yZSAlPCNw cmFnbWElPiIpOwogIGVsc2UgaWYgKHRva2VuID09IENQUF9QUkFHTUFfRU9M KQogICAgbWVzc2FnZSA9IGNhdGVuYXRlX21lc3NhZ2VzIChnbXNnaWQsICIg YmVmb3JlIGVuZCBvZiBsaW5lIik7CiAgZWxzZSBpZiAodG9rZW4gPCBOX1RU WVBFUykKICAgIHsKICAgICAgbWVzc2FnZSA9IGNhdGVuYXRlX21lc3NhZ2Vz IChnbXNnaWQsICIgYmVmb3JlICVxcyB0b2tlbiIpOwogICAgICBlcnJvciAo bWVzc2FnZSwgY3BwX3R5cGUybmFtZSAodG9rZW4pKTsKICAgICAgZnJlZSAo bWVzc2FnZSk7CiAgICAgIG1lc3NhZ2UgPSBOVUxMOwogICAgfQogIGVsc2UK ICAgIGVycm9yIChnbXNnaWQpOwoKICBpZiAobWVzc2FnZSkKICAgIHsKICAg ICAgZXJyb3IgKG1lc3NhZ2UpOwogICAgICBmcmVlIChtZXNzYWdlKTsKICAg IH0KI3VuZGVmIGNhdGVuYXRlX21lc3NhZ2VzCn0KCi8qIFdhbGsgYSBnaW1w bGlmaWVkIGZ1bmN0aW9uIGFuZCB3YXJuIGZvciBmdW5jdGlvbnMgd2hvc2Ug cmV0dXJuIHZhbHVlIGlzCiAgIGlnbm9yZWQgYW5kIGF0dHJpYnV0ZSgod2Fy bl91bnVzZWRfcmVzdWx0KSkgaXMgc2V0LiAgVGhpcyBpcyBkb25lIGJlZm9y ZQogICBpbmxpbmluZywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91 dCB0aGF0LiAgKi8KCnZvaWQKY193YXJuX3VudXNlZF9yZXN1bHQgKHRyZWUg KnRvcF9wKQp7CiAgdHJlZSB0ID0gKnRvcF9wOwogIHRyZWVfc3RtdF9pdGVy YXRvciBpOwogIHRyZWUgZmRlY2wsIGZ0eXBlOwoKICBzd2l0Y2ggKFRSRUVf Q09ERSAodCkpCiAgICB7CiAgICBjYXNlIFNUQVRFTUVOVF9MSVNUOgogICAg ICBmb3IgKGkgPSB0c2lfc3RhcnQgKCp0b3BfcCk7ICF0c2lfZW5kX3AgKGkp OyB0c2lfbmV4dCAoJmkpKQoJY193YXJuX3VudXNlZF9yZXN1bHQgKHRzaV9z dG10X3B0ciAoaSkpOwogICAgICBicmVhazsKCiAgICBjYXNlIENPTkRfRVhQ UjoKICAgICAgY193YXJuX3VudXNlZF9yZXN1bHQgKCZDT05EX0VYUFJfVEhF TiAodCkpOwogICAgICBjX3dhcm5fdW51c2VkX3Jlc3VsdCAoJkNPTkRfRVhQ Ul9FTFNFICh0KSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBCSU5EX0VYUFI6 CiAgICAgIGNfd2Fybl91bnVzZWRfcmVzdWx0ICgmQklORF9FWFBSX0JPRFkg KHQpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFRSWV9GSU5BTExZX0VYUFI6 CiAgICBjYXNlIFRSWV9DQVRDSF9FWFBSOgogICAgICBjX3dhcm5fdW51c2Vk X3Jlc3VsdCAoJlRSRUVfT1BFUkFORCAodCwgMCkpOwogICAgICBjX3dhcm5f dW51c2VkX3Jlc3VsdCAoJlRSRUVfT1BFUkFORCAodCwgMSkpOwogICAgICBi cmVhazsKICAgIGNhc2UgQ0FUQ0hfRVhQUjoKICAgICAgY193YXJuX3VudXNl ZF9yZXN1bHQgKCZDQVRDSF9CT0RZICh0KSk7CiAgICAgIGJyZWFrOwogICAg Y2FzZSBFSF9GSUxURVJfRVhQUjoKICAgICAgY193YXJuX3VudXNlZF9yZXN1 bHQgKCZFSF9GSUxURVJfRkFJTFVSRSAodCkpOwogICAgICBicmVhazsKCiAg ICBjYXNlIENBTExfRVhQUjoKICAgICAgaWYgKFRSRUVfVVNFRCAodCkpCgli cmVhazsKCiAgICAgIC8qIFRoaXMgaXMgYSBuYWtlZCBjYWxsLCBhcyBvcHBv c2VkIHRvIGEgQ0FMTF9FWFBSIG5lc3RlZCBpbnNpZGUKCSBhIE1PRElGWV9F WFBSLiAgQWxsIGNhbGxzIHdob3NlIHZhbHVlIGlzIGlnbm9yZWQgc2hvdWxk IGJlCgkgcmVwcmVzZW50ZWQgbGlrZSB0aGlzLiAgTG9vayBmb3IgdGhlIGF0 dHJpYnV0ZS4gICovCiAgICAgIGZkZWNsID0gZ2V0X2NhbGxlZV9mbmRlY2wg KHQpOwogICAgICBpZiAoZmRlY2wpCglmdHlwZSA9IFRSRUVfVFlQRSAoZmRl Y2wpOwogICAgICBlbHNlCgl7CgkgIGZ0eXBlID0gVFJFRV9UWVBFIChDQUxM X0VYUFJfRk4gKHQpKTsKCSAgLyogTG9vayBwYXN0IHBvaW50ZXItdG8tZnVu Y3Rpb24gdG8gdGhlIGZ1bmN0aW9uIHR5cGUgaXRzZWxmLiAgKi8KCSAgZnR5 cGUgPSBUUkVFX1RZUEUgKGZ0eXBlKTsKCX0KCiAgICAgIGlmIChsb29rdXBf YXR0cmlidXRlICgid2Fybl91bnVzZWRfcmVzdWx0IiwgVFlQRV9BVFRSSUJV VEVTIChmdHlwZSkpKQoJewoJICBpZiAoZmRlY2wpCgkgICAgd2FybmluZyAo MCwgIiVIaWdub3JpbmcgcmV0dXJuIHZhbHVlIG9mICVxRCwgIgoJCSAgICAg ImRlY2xhcmVkIHdpdGggYXR0cmlidXRlIHdhcm5fdW51c2VkX3Jlc3VsdCIs CgkJICAgICBFWFBSX0xPQ1VTICh0KSwgZmRlY2wpOwoJICBlbHNlCgkgICAg d2FybmluZyAoMCwgIiVIaWdub3JpbmcgcmV0dXJuIHZhbHVlIG9mIGZ1bmN0 aW9uICIKCQkgICAgICJkZWNsYXJlZCB3aXRoIGF0dHJpYnV0ZSB3YXJuX3Vu dXNlZF9yZXN1bHQiLAoJCSAgICAgRVhQUl9MT0NVUyAodCkpOwoJfQogICAg ICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAvKiBOb3QgYSBjb250YWlu ZXIsIG5vdCBhIGNhbGwsIG9yIGEgY2FsbCB3aG9zZSB2YWx1ZSBpcyB1c2Vk LiAgKi8KICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qIENvbnZlcnQgYSBjaGFy YWN0ZXIgZnJvbSB0aGUgaG9zdCB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBj aGFyYWN0ZXIKICAgc2V0LiAgY3BwbGliIGhhbmRsZXMgdGhpcywgbW9zdGx5 LiAgKi8KCkhPU1RfV0lERV9JTlQKY19jb21tb25fdG9fdGFyZ2V0X2NoYXJz ZXQgKEhPU1RfV0lERV9JTlQgYykKewogIC8qIENoYXJhY3RlciBjb25zdGFu dHMgaW4gR0NDIHByb3BlciBhcmUgc2lnbi1leHRlbmRlZCB1bmRlciAtZnNp Z25lZC1jaGFyLAogICAgIHplcm8tZXh0ZW5kZWQgdW5kZXIgLWZuby1zaWdu ZWQtY2hhci4gIGNwcGxpYiBpbnNpc3RzIHRoYXQgY2hhcmFjdGVycwogICAg IGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBhbHdheXMgdW5zaWduZWQu ICBIZW5jZSB3ZSBtdXN0IGNvbnZlcnQKICAgICBiYWNrIGFuZCBmb3J0aC4g ICovCiAgY3BwY2hhcl90IHVjID0gKChjcHBjaGFyX3QpYykgJiAoKCgoY3Bw Y2hhcl90KTEpIDw8IENIQVJfQklUKS0xKTsKCiAgdWMgPSBjcHBfaG9zdF90 b19leGVjX2NoYXJzZXQgKHBhcnNlX2luLCB1Yyk7CgogIGlmIChmbGFnX3Np Z25lZF9jaGFyKQogICAgcmV0dXJuICgoSE9TVF9XSURFX0lOVCl1YykgPDwg KEhPU1RfQklUU19QRVJfV0lERV9JTlQgLSBDSEFSX1RZUEVfU0laRSkKCQkJ ICAgICAgID4+IChIT1NUX0JJVFNfUEVSX1dJREVfSU5UIC0gQ0hBUl9UWVBF X1NJWkUpOwogIGVsc2UKICAgIHJldHVybiB1YzsKfQoKLyogQnVpbGQgdGhl IHJlc3VsdCBvZiBfX2J1aWx0aW5fb2Zmc2V0b2YuICBFWFBSIGlzIGEgbmVz dGVkIHNlcXVlbmNlIG9mCiAgIGNvbXBvbmVudCByZWZlcmVuY2VzLCB3aXRo IFNUT1BfUkVGLCBvciBhbHRlcm5hdGl2ZWx5IGFuIElORElSRUNUX1JFRiBv ZgogICBOVUxMLCBhdCB0aGUgYm90dG9tOyBtdWNoIGxpa2UgdGhlIHRyYWRp dGlvbmFsIHJlbmRlcmluZyBvZiBvZmZzZXRvZiBhcyBhCiAgIG1hY3JvLiAg UmV0dXJucyB0aGUgZm9sZGVkIGFuZCBwcm9wZXJseSBjYXN0IHJlc3VsdC4g ICovCgpzdGF0aWMgdHJlZQpmb2xkX29mZnNldG9mXzEgKHRyZWUgZXhwciwg dHJlZSBzdG9wX3JlZikKewogIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBQTFVT X0VYUFI7CiAgdHJlZSBiYXNlLCBvZmYsIHQ7CgogIGlmIChleHByID09IHN0 b3BfcmVmICYmIFRSRUVfQ09ERSAoZXhwcikgIT0gRVJST1JfTUFSSykKICAg IHJldHVybiBzaXplX3plcm9fbm9kZTsKCiAgc3dpdGNoIChUUkVFX0NPREUg KGV4cHIpKQogICAgewogICAgY2FzZSBFUlJPUl9NQVJLOgogICAgICByZXR1 cm4gZXhwcjsKCiAgICBjYXNlIFZBUl9ERUNMOgogICAgICBlcnJvciAoImNh bm5vdCBhcHBseSAlPG9mZnNldG9mJT4gdG8gc3RhdGljIGRhdGEgbWVtYmVy ICVxRCIsIGV4cHIpOwogICAgICByZXR1cm4gZXJyb3JfbWFya19ub2RlOwoK ICAgIGNhc2UgQ0FMTF9FWFBSOgogICAgICBlcnJvciAoImNhbm5vdCBhcHBs eSAlPG9mZnNldG9mJT4gd2hlbiAlPG9wZXJhdG9yW10lPiBpcyBvdmVybG9h ZGVkIik7CiAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7CgogICAgY2Fz ZSBJTlRFR0VSX0NTVDoKICAgICAgZ2NjX2Fzc2VydCAoaW50ZWdlcl96ZXJv cCAoZXhwcikpOwogICAgICByZXR1cm4gc2l6ZV96ZXJvX25vZGU7CgogICAg Y2FzZSBOT1BfRVhQUjoKICAgIGNhc2UgSU5ESVJFQ1RfUkVGOgogICAgICBi YXNlID0gZm9sZF9vZmZzZXRvZl8xIChUUkVFX09QRVJBTkQgKGV4cHIsIDAp LCBzdG9wX3JlZik7CiAgICAgIGdjY19hc3NlcnQgKGJhc2UgPT0gZXJyb3Jf bWFya19ub2RlIHx8IGJhc2UgPT0gc2l6ZV96ZXJvX25vZGUpOwogICAgICBy ZXR1cm4gYmFzZTsKCiAgICBjYXNlIENPTVBPTkVOVF9SRUY6CiAgICAgIGJh c2UgPSBmb2xkX29mZnNldG9mXzEgKFRSRUVfT1BFUkFORCAoZXhwciwgMCks IHN0b3BfcmVmKTsKICAgICAgaWYgKGJhc2UgPT0gZXJyb3JfbWFya19ub2Rl KQoJcmV0dXJuIGJhc2U7CgogICAgICB0ID0gVFJFRV9PUEVSQU5EIChleHBy LCAxKTsKICAgICAgaWYgKERFQ0xfQ19CSVRfRklFTEQgKHQpKQoJewoJICBl cnJvciAoImF0dGVtcHQgdG8gdGFrZSBhZGRyZXNzIG9mIGJpdC1maWVsZCBz dHJ1Y3R1cmUgIgoJCSAibWVtYmVyICVxRCIsIHQpOwoJICByZXR1cm4gZXJy b3JfbWFya19ub2RlOwoJfQogICAgICBvZmYgPSBzaXplX2Jpbm9wIChQTFVT X0VYUFIsIERFQ0xfRklFTERfT0ZGU0VUICh0KSwKCQkJc2l6ZV9pbnQgKHRy ZWVfbG93X2NzdCAoREVDTF9GSUVMRF9CSVRfT0ZGU0VUICh0KSwgMSkKCQkJ CSAgLyBCSVRTX1BFUl9VTklUKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2Ug QVJSQVlfUkVGOgogICAgICBiYXNlID0gZm9sZF9vZmZzZXRvZl8xIChUUkVF X09QRVJBTkQgKGV4cHIsIDApLCBzdG9wX3JlZik7CiAgICAgIGlmIChiYXNl ID09IGVycm9yX21hcmtfbm9kZSkKCXJldHVybiBiYXNlOwoKICAgICAgdCA9 IFRSRUVfT1BFUkFORCAoZXhwciwgMSk7CiAgICAgIGlmIChUUkVFX0NPREUg KHQpID09IElOVEVHRVJfQ1NUICYmIHRyZWVfaW50X2NzdF9zZ24gKHQpIDwg MCkKCXsKCSAgY29kZSA9IE1JTlVTX0VYUFI7CgkgIHQgPSBmb2xkX2J1aWxk MSAoTkVHQVRFX0VYUFIsIFRSRUVfVFlQRSAodCksIHQpOwoJfQogICAgICB0 ID0gY29udmVydCAoc2l6ZXR5cGUsIHQpOwogICAgICBvZmYgPSBzaXplX2Jp bm9wIChNVUxUX0VYUFIsIFRZUEVfU0laRV9VTklUIChUUkVFX1RZUEUgKGV4 cHIpKSwgdCk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ09NUE9VTkRfRVhQ UjoKICAgICAgLyogSGFuZGxlIHN0YXRpYyBtZW1iZXJzIG9mIHZvbGF0aWxl IHN0cnVjdHMuICAqLwogICAgICB0ID0gVFJFRV9PUEVSQU5EIChleHByLCAx KTsKICAgICAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFICh0KSA9PSBWQVJfREVD TCk7CiAgICAgIHJldHVybiBmb2xkX29mZnNldG9mXzEgKHQsIHN0b3BfcmVm KTsKCiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAg ICB9CgogIHJldHVybiBzaXplX2Jpbm9wIChjb2RlLCBiYXNlLCBvZmYpOwp9 Cgp0cmVlCmZvbGRfb2Zmc2V0b2YgKHRyZWUgZXhwciwgdHJlZSBzdG9wX3Jl ZikKewogIC8qIENvbnZlcnQgYmFjayBmcm9tIHRoZSBpbnRlcm5hbCBzaXpl dHlwZSB0byBzaXplX3QuICAqLwogIHJldHVybiBjb252ZXJ0IChzaXplX3R5 cGVfbm9kZSwgZm9sZF9vZmZzZXRvZl8xIChleHByLCBzdG9wX3JlZikpOwp9 CgovKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGZvciBhbiBpbnZhbGlkIGx2 YWx1ZS4gIFVTRSBzYXlzCiAgIGhvdyB0aGUgbHZhbHVlIGlzIGJlaW5nIHVz ZWQgYW5kIHNvIHNlbGVjdHMgdGhlIGVycm9yIG1lc3NhZ2UuICAqLwoKdm9p ZApsdmFsdWVfZXJyb3IgKGVudW0gbHZhbHVlX3VzZSB1c2UpCnsKICBzd2l0 Y2ggKHVzZSkKICAgIHsKICAgIGNhc2UgbHZfYXNzaWduOgogICAgICBlcnJv ciAoImx2YWx1ZSByZXF1aXJlZCBhcyBsZWZ0IG9wZXJhbmQgb2YgYXNzaWdu bWVudCIpOwogICAgICBicmVhazsKICAgIGNhc2UgbHZfaW5jcmVtZW50Ogog ICAgICBlcnJvciAoImx2YWx1ZSByZXF1aXJlZCBhcyBpbmNyZW1lbnQgb3Bl cmFuZCIpOwogICAgICBicmVhazsKICAgIGNhc2UgbHZfZGVjcmVtZW50Ogog ICAgICBlcnJvciAoImx2YWx1ZSByZXF1aXJlZCBhcyBkZWNyZW1lbnQgb3Bl cmFuZCIpOwogICAgICBicmVhazsKICAgIGNhc2UgbHZfYWRkcmVzc29mOgog ICAgICBlcnJvciAoImx2YWx1ZSByZXF1aXJlZCBhcyB1bmFyeSAlPCYlPiBv cGVyYW5kIik7CiAgICAgIGJyZWFrOwogICAgY2FzZSBsdl9hc206CiAgICAg IGVycm9yICgibHZhbHVlIHJlcXVpcmVkIGluIGFzbSBzdGF0ZW1lbnQiKTsK ICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5yZWFjaGFi bGUgKCk7CiAgICB9Cn0KDAovKiAqUFRZUEUgaXMgYW4gaW5jb21wbGV0ZSBh cnJheS4gIENvbXBsZXRlIGl0IHdpdGggYSBkb21haW4gYmFzZWQgb24KICAg SU5JVElBTF9WQUxVRS4gIElmIElOSVRJQUxfVkFMVUUgaXMgbm90IHByZXNl bnQsIHVzZSAxIGlmIERPX0RFRkFVTFQKICAgaXMgdHJ1ZS4gIFJldHVybiAw IGlmIHN1Y2Nlc3NmdWwsIDEgaWYgSU5JVElBTF9WQUxVRSBjYW4ndCBiZSBk ZWNpcGhlcmVkLAogICAyIGlmIElOSVRJQUxfVkFMVUUgd2FzIE5VTEwsIGFu ZCAzIGlmIElOSVRJQUxfVkFMVUUgd2FzIGVtcHR5LiAgKi8KCmludApjb21w bGV0ZV9hcnJheV90eXBlICh0cmVlICpwdHlwZSwgdHJlZSBpbml0aWFsX3Zh bHVlLCBib29sIGRvX2RlZmF1bHQpCnsKICB0cmVlIG1heGluZGV4LCB0eXBl LCBtYWluX3R5cGUsIGVsdCwgdW5xdWFsX2VsdDsKICBpbnQgZmFpbHVyZSA9 IDAsIHF1YWxzOwogIGhhc2h2YWxfdCBoYXNoY29kZSA9IDA7CgogIG1heGlu ZGV4ID0gc2l6ZV96ZXJvX25vZGU7CiAgaWYgKGluaXRpYWxfdmFsdWUpCiAg ICB7CiAgICAgIGlmIChUUkVFX0NPREUgKGluaXRpYWxfdmFsdWUpID09IFNU UklOR19DU1QpCgl7CgkgIGludCBlbHRzaXplCgkgICAgPSBpbnRfc2l6ZV9p bl9ieXRlcyAoVFJFRV9UWVBFIChUUkVFX1RZUEUgKGluaXRpYWxfdmFsdWUp KSk7CgkgIG1heGluZGV4ID0gc2l6ZV9pbnQgKFRSRUVfU1RSSU5HX0xFTkdU SCAoaW5pdGlhbF92YWx1ZSkvZWx0c2l6ZSAtIDEpOwoJfQogICAgICBlbHNl IGlmIChUUkVFX0NPREUgKGluaXRpYWxfdmFsdWUpID09IENPTlNUUlVDVE9S KQoJewoJICBWRUMoY29uc3RydWN0b3JfZWx0LGdjKSAqdiA9IENPTlNUUlVD VE9SX0VMVFMgKGluaXRpYWxfdmFsdWUpOwoKCSAgaWYgKFZFQ19lbXB0eSAo Y29uc3RydWN0b3JfZWx0LCB2KSkKCSAgICB7CgkgICAgICBpZiAocGVkYW50 aWMpCgkJZmFpbHVyZSA9IDM7CgkgICAgICBtYXhpbmRleCA9IGludGVnZXJf bWludXNfb25lX25vZGU7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAg dHJlZSBjdXJpbmRleDsKCSAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQg Y250OwoJICAgICAgY29uc3RydWN0b3JfZWx0ICpjZTsKCgkgICAgICBpZiAo VkVDX2luZGV4IChjb25zdHJ1Y3Rvcl9lbHQsIHYsIDApLT5pbmRleCkKCQlt YXhpbmRleCA9IGZvbGRfY29udmVydCAoc2l6ZXR5cGUsCgkJCQkJIFZFQ19p bmRleCAoY29uc3RydWN0b3JfZWx0LAoJCQkJCQkgICAgdiwgMCktPmluZGV4 KTsKCSAgICAgIGN1cmluZGV4ID0gbWF4aW5kZXg7CgoJICAgICAgZm9yIChj bnQgPSAxOwoJCSAgIFZFQ19pdGVyYXRlIChjb25zdHJ1Y3Rvcl9lbHQsIHYs IGNudCwgY2UpOwoJCSAgIGNudCsrKQoJCXsKCQkgIGlmIChjZS0+aW5kZXgp CgkJICAgIGN1cmluZGV4ID0gZm9sZF9jb252ZXJ0IChzaXpldHlwZSwgY2Ut PmluZGV4KTsKCQkgIGVsc2UKCQkgICAgY3VyaW5kZXggPSBzaXplX2Jpbm9w IChQTFVTX0VYUFIsIGN1cmluZGV4LCBzaXplX29uZV9ub2RlKTsKCgkJICBp ZiAodHJlZV9pbnRfY3N0X2x0IChtYXhpbmRleCwgY3VyaW5kZXgpKQoJCSAg ICBtYXhpbmRleCA9IGN1cmluZGV4OwoJCX0KCSAgICB9Cgl9CiAgICAgIGVs c2UKCXsKCSAgLyogTWFrZSBhbiBlcnJvciBtZXNzYWdlIHVubGVzcyB0aGF0 IGhhcHBlbmVkIGFscmVhZHkuICAqLwoJICBpZiAoaW5pdGlhbF92YWx1ZSAh PSBlcnJvcl9tYXJrX25vZGUpCgkgICAgZmFpbHVyZSA9IDE7Cgl9CiAgICB9 CiAgZWxzZQogICAgewogICAgICBmYWlsdXJlID0gMjsKICAgICAgaWYgKCFk b19kZWZhdWx0KQoJcmV0dXJuIGZhaWx1cmU7CiAgICB9CgogIHR5cGUgPSAq cHR5cGU7CiAgZWx0ID0gVFJFRV9UWVBFICh0eXBlKTsKICBxdWFscyA9IFRZ UEVfUVVBTFMgKHN0cmlwX2FycmF5X3R5cGVzIChlbHQpKTsKICBpZiAocXVh bHMgPT0gMCkKICAgIHVucXVhbF9lbHQgPSBlbHQ7CiAgZWxzZQogICAgdW5x dWFsX2VsdCA9IGNfYnVpbGRfcXVhbGlmaWVkX3R5cGUgKGVsdCwgVFlQRV9V TlFVQUxJRklFRCk7CgogIC8qIFVzaW5nIGJ1aWxkX2Rpc3RpbmN0X3R5cGVf Y29weSBhbmQgbW9kaWZ5aW5nIHRoaW5ncyBhZnRlcndhcmQgaW5zdGVhZAog ICAgIG9mIHVzaW5nIGJ1aWxkX2FycmF5X3R5cGUgdG8gY3JlYXRlIGEgbmV3 IHR5cGUgcHJlc2VydmVzIGFsbCBvZiB0aGUKICAgICBUWVBFX0xBTkdfRkxB R18/IGJpdHMgdGhhdCB0aGUgZnJvbnQgZW5kIG1heSBoYXZlIHNldC4gICov CiAgbWFpbl90eXBlID0gYnVpbGRfZGlzdGluY3RfdHlwZV9jb3B5IChUWVBF X01BSU5fVkFSSUFOVCAodHlwZSkpOwogIFRSRUVfVFlQRSAobWFpbl90eXBl KSA9IHVucXVhbF9lbHQ7CiAgVFlQRV9ET01BSU4gKG1haW5fdHlwZSkgPSBi dWlsZF9pbmRleF90eXBlIChtYXhpbmRleCk7CiAgbGF5b3V0X3R5cGUgKG1h aW5fdHlwZSk7CgogIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjYW5vbmlj YWwgTUFJTl9UWVBFLiAqLwogIGhhc2hjb2RlID0gaXRlcmF0aXZlX2hhc2hf b2JqZWN0IChUWVBFX0hBU0ggKHVucXVhbF9lbHQpLCBoYXNoY29kZSk7CiAg aGFzaGNvZGUgPSBpdGVyYXRpdmVfaGFzaF9vYmplY3QgKFRZUEVfSEFTSCAo VFlQRV9ET01BSU4gKG1haW5fdHlwZSkpLCAKCQkJCSAgICBoYXNoY29kZSk7 CiAgbWFpbl90eXBlID0gdHlwZV9oYXNoX2Nhbm9uIChoYXNoY29kZSwgbWFp bl90eXBlKTsKCiAgLyogRml4IHRoZSBjYW5vbmljYWwgdHlwZS4gICovCiAg aWYgKFRZUEVfU1RSVUNUVVJBTF9FUVVBTElUWV9QIChUUkVFX1RZUEUgKG1h aW5fdHlwZSkpCiAgICAgIHx8IFRZUEVfU1RSVUNUVVJBTF9FUVVBTElUWV9Q IChUWVBFX0RPTUFJTiAobWFpbl90eXBlKSkpCiAgICBTRVRfVFlQRV9TVFJV Q1RVUkFMX0VRVUFMSVRZIChtYWluX3R5cGUpOwogIGVsc2UgaWYgKFRZUEVf Q0FOT05JQ0FMIChUUkVFX1RZUEUgKG1haW5fdHlwZSkpICE9IFRSRUVfVFlQ RSAobWFpbl90eXBlKQoJICAgfHwgKFRZUEVfQ0FOT05JQ0FMIChUWVBFX0RP TUFJTiAobWFpbl90eXBlKSkKCSAgICAgICAhPSBUWVBFX0RPTUFJTiAobWFp bl90eXBlKSkpCiAgICBUWVBFX0NBTk9OSUNBTCAobWFpbl90eXBlKSAKICAg ICAgPSBidWlsZF9hcnJheV90eXBlIChUWVBFX0NBTk9OSUNBTCAoVFJFRV9U WVBFIChtYWluX3R5cGUpKSwKCQkJICBUWVBFX0NBTk9OSUNBTCAoVFlQRV9E T01BSU4gKG1haW5fdHlwZSkpKTsKICBlbHNlCiAgICBUWVBFX0NBTk9OSUNB TCAobWFpbl90eXBlKSA9IG1haW5fdHlwZTsKCiAgaWYgKHF1YWxzID09IDAp CiAgICB0eXBlID0gbWFpbl90eXBlOwogIGVsc2UKICAgIHR5cGUgPSBjX2J1 aWxkX3F1YWxpZmllZF90eXBlIChtYWluX3R5cGUsIHF1YWxzKTsKCiAgaWYg KENPTVBMRVRFX1RZUEVfUCAodHlwZSkKICAgICAgJiYgVFJFRV9DT0RFIChU WVBFX1NJWkVfVU5JVCAodHlwZSkpID09IElOVEVHRVJfQ1NUCiAgICAgICYm IFRSRUVfT1ZFUkZMT1cgKFRZUEVfU0laRV9VTklUICh0eXBlKSkpCiAgICB7 CiAgICAgIGVycm9yICgic2l6ZSBvZiBhcnJheSBpcyB0b28gbGFyZ2UiKTsK ICAgICAgLyogSWYgd2UgcHJvY2VlZCB3aXRoIHRoZSBhcnJheSB0eXBlIGFz IGl0IGlzLCB3ZSdsbCBldmVudHVhbGx5CgkgY3Jhc2ggaW4gdHJlZV9sb3df Y3N0KCkuICAqLwogICAgICB0eXBlID0gZXJyb3JfbWFya19ub2RlOwogICAg fQoKICAqcHR5cGUgPSB0eXBlOwogIHJldHVybiBmYWlsdXJlOwp9CgoMCi8q IFVzZWQgdG8gaGVscCBpbml0aWFsaXplIHRoZSBidWlsdGluLXR5cGVzLmRl ZiB0YWJsZS4gIFdoZW4gYSB0eXBlIG9mCiAgIHRoZSBjb3JyZWN0IHNpemUg ZG9lc24ndCBleGlzdCwgdXNlIGVycm9yX21hcmtfbm9kZSBpbnN0ZWFkIG9m IE5VTEwuCiAgIFRoZSBsYXRlciByZXN1bHRzIGluIHNlZ2ZhdWx0cyBldmVu IHdoZW4gYSBkZWNsIHVzaW5nIHRoZSB0eXBlIGRvZXNuJ3QKICAgZ2V0IGlu dm9rZWQuICAqLwoKdHJlZQpidWlsdGluX3R5cGVfZm9yX3NpemUgKGludCBz aXplLCBib29sIHVuc2lnbmVkcCkKewogIHRyZWUgdHlwZSA9IGxhbmdfaG9v a3MudHlwZXMudHlwZV9mb3Jfc2l6ZSAoc2l6ZSwgdW5zaWduZWRwKTsKICBy ZXR1cm4gdHlwZSA/IHR5cGUgOiBlcnJvcl9tYXJrX25vZGU7Cn0KCi8qIEEg aGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZlX292ZXJsb2FkZWRfYnVpbHRp biBpbiByZXNvbHZpbmcgdGhlCiAgIG92ZXJsb2FkZWQgX19zeW5jXyBidWls dGlucy4gIFJldHVybnMgYSBwb3NpdGl2ZSBwb3dlciBvZiAyIGlmIHRoZQog ICBmaXJzdCBvcGVyYW5kIG9mIFBBUkFNUyBpcyBhIHBvaW50ZXIgdG8gYSBz dXBwb3J0ZWQgZGF0YSB0eXBlLgogICBSZXR1cm5zIDAgaWYgYW4gZXJyb3Ig aXMgZW5jb3VudGVyZWQuICAqLwoKc3RhdGljIGludApzeW5jX3Jlc29sdmVf c2l6ZSAodHJlZSBmdW5jdGlvbiwgdHJlZSBwYXJhbXMpCnsKICB0cmVlIHR5 cGU7CiAgaW50IHNpemU7CgogIGlmIChwYXJhbXMgPT0gTlVMTCkKICAgIHsK ICAgICAgZXJyb3IgKCJ0b28gZmV3IGFyZ3VtZW50cyB0byBmdW5jdGlvbiAl cUUiLCBmdW5jdGlvbik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICB0eXBl ID0gVFJFRV9UWVBFIChUUkVFX1ZBTFVFIChwYXJhbXMpKTsKICBpZiAoVFJF RV9DT0RFICh0eXBlKSAhPSBQT0lOVEVSX1RZUEUpCiAgICBnb3RvIGluY29t cGF0aWJsZTsKCiAgdHlwZSA9IFRSRUVfVFlQRSAodHlwZSk7CiAgaWYgKCFJ TlRFR1JBTF9UWVBFX1AgKHR5cGUpICYmICFQT0lOVEVSX1RZUEVfUCAodHlw ZSkpCiAgICBnb3RvIGluY29tcGF0aWJsZTsKCiAgc2l6ZSA9IHRyZWVfbG93 X2NzdCAoVFlQRV9TSVpFX1VOSVQgKHR5cGUpLCAxKTsKICBpZiAoc2l6ZSA9 PSAxIHx8IHNpemUgPT0gMiB8fCBzaXplID09IDQgfHwgc2l6ZSA9PSA4IHx8 IHNpemUgPT0gMTYpCiAgICByZXR1cm4gc2l6ZTsKCiBpbmNvbXBhdGlibGU6 CiAgZXJyb3IgKCJpbmNvbXBhdGlibGUgdHlwZSBmb3IgYXJndW1lbnQgJWQg b2YgJXFFIiwgMSwgZnVuY3Rpb24pOwogIHJldHVybiAwOwp9CgovKiBBIGhl bHBlciBmdW5jdGlvbiBmb3IgcmVzb2x2ZV9vdmVybG9hZGVkX2J1aWx0aW4u ICBBZGRzIGNhc3RzIHRvCiAgIFBBUkFNUyB0byBtYWtlIGFyZ3VtZW50cyBt YXRjaCB1cCB3aXRoIHRob3NlIG9mIEZVTkNUSU9OLiAgRHJvcHMKICAgdGhl IHZhcmlhZGljIGFyZ3VtZW50cyBhdCB0aGUgZW5kLiAgUmV0dXJucyBmYWxz ZSBpZiBzb21lIGVycm9yCiAgIHdhcyBlbmNvdW50ZXJlZDsgdHJ1ZSBvbiBz dWNjZXNzLiAgKi8KCnN0YXRpYyBib29sCnN5bmNfcmVzb2x2ZV9wYXJhbXMg KHRyZWUgb3JpZ19mdW5jdGlvbiwgdHJlZSBmdW5jdGlvbiwgdHJlZSBwYXJh bXMpCnsKICB0cmVlIGFyZ190eXBlcyA9IFRZUEVfQVJHX1RZUEVTIChUUkVF X1RZUEUgKGZ1bmN0aW9uKSk7CiAgdHJlZSBwdHlwZTsKICBpbnQgbnVtYmVy OwoKICAvKiBXZSd2ZSBkZWNsYXJlZCB0aGUgaW1wbGVtZW50YXRpb24gZnVu Y3Rpb25zIHRvIHVzZSAidm9sYXRpbGUgdm9pZCAqIgogICAgIGFzIHRoZSBw b2ludGVyIHBhcmFtZXRlciwgc28gd2Ugc2hvdWxkbid0IGdldCBhbnkgY29t cGxhaW50cyBmcm9tIHRoZQogICAgIGNhbGwgdG8gY2hlY2tfZnVuY3Rpb25f YXJndW1lbnRzIHdoYXQgZXZlciB0eXBlIHRoZSB1c2VyIHVzZWQuICAqLwog IGFyZ190eXBlcyA9IFRSRUVfQ0hBSU4gKGFyZ190eXBlcyk7CiAgcHR5cGUg PSBUUkVFX1RZUEUgKFRSRUVfVFlQRSAoVFJFRV9WQUxVRSAocGFyYW1zKSkp OwogIG51bWJlciA9IDI7CgogIC8qIEZvciB0aGUgcmVzdCBvZiB0aGUgdmFs dWVzLCB3ZSBuZWVkIHRvIGNhc3QgdGhlc2UgdG8gRlRZUEUsIHNvIHRoYXQg d2UKICAgICBkb24ndCBnZXQgd2FybmluZ3MgZm9yIHBhc3NpbmcgcG9pbnRl ciB0eXBlcywgZXRjLiAgKi8KICB3aGlsZSAoYXJnX3R5cGVzICE9IHZvaWRf bGlzdF9ub2RlKQogICAgewogICAgICB0cmVlIHZhbDsKCiAgICAgIHBhcmFt cyA9IFRSRUVfQ0hBSU4gKHBhcmFtcyk7CiAgICAgIGlmIChwYXJhbXMgPT0g TlVMTCkKCXsKCSAgZXJyb3IgKCJ0b28gZmV3IGFyZ3VtZW50cyB0byBmdW5j dGlvbiAlcUUiLCBvcmlnX2Z1bmN0aW9uKTsKCSAgcmV0dXJuIGZhbHNlOwoJ fQoKICAgICAgLyogPz8/IElkZWFsbHkgZm9yIHRoZSBmaXJzdCBjb252ZXJz aW9uIHdlJ2QgdXNlIGNvbnZlcnRfZm9yX2Fzc2lnbm1lbnQKCSBzbyB0aGF0 IHdlIGdldCB3YXJuaW5ncyBmb3IgYW55dGhpbmcgdGhhdCBkb2Vzbid0IG1h dGNoIHRoZSBwb2ludGVyCgkgdHlwZS4gIFRoaXMgaXNuJ3QgcG9ydGFibGUg YWNyb3NzIHRoZSBDIGFuZCBDKysgZnJvbnQgZW5kcyBhdG0uICAqLwogICAg ICB2YWwgPSBUUkVFX1ZBTFVFIChwYXJhbXMpOwogICAgICB2YWwgPSBjb252 ZXJ0IChwdHlwZSwgdmFsKTsKICAgICAgdmFsID0gY29udmVydCAoVFJFRV9W QUxVRSAoYXJnX3R5cGVzKSwgdmFsKTsKICAgICAgVFJFRV9WQUxVRSAocGFy YW1zKSA9IHZhbDsKCiAgICAgIGFyZ190eXBlcyA9IFRSRUVfQ0hBSU4gKGFy Z190eXBlcyk7CiAgICAgIG51bWJlcisrOwogICAgfQoKICAvKiBUaGUgZGVm aW5pdGlvbiBvZiB0aGVzZSBwcmltaXRpdmVzIGlzIHZhcmlhZGljLCB3aXRo IHRoZSByZW1haW5pbmcKICAgICBiZWluZyAiYW4gb3B0aW9uYWwgbGlzdCBv ZiB2YXJpYWJsZXMgcHJvdGVjdGVkIGJ5IHRoZSBtZW1vcnkgYmFycmllciIu CiAgICAgTm8gY2x1ZSB3aGF0IHRoYXQncyBzdXBwb3NlZCB0byBtZWFuLCBw cmVjaXNlbHksIGJ1dCB3ZSBjb25zaWRlciBhbGwKICAgICBjYWxsLWNsb2Ji ZXJlZCB2YXJpYWJsZXMgdG8gYmUgcHJvdGVjdGVkIHNvIHdlJ3JlIHNhZmUu ICAqLwogIFRSRUVfQ0hBSU4gKHBhcmFtcykgPSBOVUxMOwoKICByZXR1cm4g dHJ1ZTsKfQoKLyogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIHJlc29sdmVfb3Zl cmxvYWRlZF9idWlsdGluLiAgQWRkcyBhIGNhc3QgdG8KICAgUkVTVUxUIHRv IG1ha2UgaXQgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGZpcnN0IHBvaW50ZXIg YXJndW1lbnQgaW4KICAgUEFSQU1TLiAgKi8KCnN0YXRpYyB0cmVlCnN5bmNf cmVzb2x2ZV9yZXR1cm4gKHRyZWUgcGFyYW1zLCB0cmVlIHJlc3VsdCkKewog IHRyZWUgcHR5cGUgPSBUUkVFX1RZUEUgKFRSRUVfVFlQRSAoVFJFRV9WQUxV RSAocGFyYW1zKSkpOwogIHB0eXBlID0gVFlQRV9NQUlOX1ZBUklBTlQgKHB0 eXBlKTsKICByZXR1cm4gY29udmVydCAocHR5cGUsIHJlc3VsdCk7Cn0KCi8q IFNvbWUgYnVpbHRpbiBmdW5jdGlvbnMgYXJlIHBsYWNlaG9sZGVycyBmb3Ig b3RoZXIgZXhwcmVzc2lvbnMuICBUaGlzCiAgIGZ1bmN0aW9uIHNob3VsZCBi ZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcGFyc2luZyB0aGUgY2FsbCBl eHByZXNzaW9uCiAgIGJlZm9yZSBzdXJyb3VuZGluZyBjb2RlIGhhcyBjb21t aXR0ZWQgdG8gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uCgogICBGVU5D VElPTiBpcyB0aGUgREVDTCB0aGF0IGhhcyBiZWVuIGludm9rZWQ7IGl0IGlz IGtub3duIHRvIGJlIGEgYnVpbHRpbi4KICAgUEFSQU1TIGlzIHRoZSBhcmd1 bWVudCBsaXN0IGZvciB0aGUgY2FsbC4gIFRoZSByZXR1cm4gdmFsdWUgaXMg bm9uLW51bGwKICAgd2hlbiBleHBhbnNpb24gaXMgY29tcGxldGUsIGFuZCBu dWxsIGlmIG5vcm1hbCBwcm9jZXNzaW5nIHNob3VsZAogICBjb250aW51ZS4g ICovCgp0cmVlCnJlc29sdmVfb3ZlcmxvYWRlZF9idWlsdGluICh0cmVlIGZ1 bmN0aW9uLCB0cmVlIHBhcmFtcykKewogIGVudW0gYnVpbHRfaW5fZnVuY3Rp b24gb3JpZ19jb2RlID0gREVDTF9GVU5DVElPTl9DT0RFIChmdW5jdGlvbik7 CiAgc3dpdGNoIChERUNMX0JVSUxUX0lOX0NMQVNTIChmdW5jdGlvbikpCiAg ICB7CiAgICBjYXNlIEJVSUxUX0lOX05PUk1BTDoKICAgICAgYnJlYWs7CiAg ICBjYXNlIEJVSUxUX0lOX01EOgogICAgICBpZiAodGFyZ2V0bS5yZXNvbHZl X292ZXJsb2FkZWRfYnVpbHRpbikKCXJldHVybiB0YXJnZXRtLnJlc29sdmVf b3ZlcmxvYWRlZF9idWlsdGluIChmdW5jdGlvbiwgcGFyYW1zKTsKICAgICAg ZWxzZQoJcmV0dXJuIE5VTExfVFJFRTsKICAgIGRlZmF1bHQ6CiAgICAgIHJl dHVybiBOVUxMX1RSRUU7CiAgICB9CgogIC8qIEhhbmRsZSBCVUlMVF9JTl9O T1JNQUwgaGVyZS4gICovCiAgc3dpdGNoIChvcmlnX2NvZGUpCiAgICB7CiAg ICBjYXNlIEJVSUxUX0lOX0ZFVENIX0FORF9BRERfTjoKICAgIGNhc2UgQlVJ TFRfSU5fRkVUQ0hfQU5EX1NVQl9OOgogICAgY2FzZSBCVUlMVF9JTl9GRVRD SF9BTkRfT1JfTjoKICAgIGNhc2UgQlVJTFRfSU5fRkVUQ0hfQU5EX0FORF9O OgogICAgY2FzZSBCVUlMVF9JTl9GRVRDSF9BTkRfWE9SX046CiAgICBjYXNl IEJVSUxUX0lOX0ZFVENIX0FORF9OQU5EX046CiAgICBjYXNlIEJVSUxUX0lO X0FERF9BTkRfRkVUQ0hfTjoKICAgIGNhc2UgQlVJTFRfSU5fU1VCX0FORF9G RVRDSF9OOgogICAgY2FzZSBCVUlMVF9JTl9PUl9BTkRfRkVUQ0hfTjoKICAg IGNhc2UgQlVJTFRfSU5fQU5EX0FORF9GRVRDSF9OOgogICAgY2FzZSBCVUlM VF9JTl9YT1JfQU5EX0ZFVENIX046CiAgICBjYXNlIEJVSUxUX0lOX05BTkRf QU5EX0ZFVENIX046CiAgICBjYXNlIEJVSUxUX0lOX0JPT0xfQ09NUEFSRV9B TkRfU1dBUF9OOgogICAgY2FzZSBCVUlMVF9JTl9WQUxfQ09NUEFSRV9BTkRf U1dBUF9OOgogICAgY2FzZSBCVUlMVF9JTl9MT0NLX1RFU1RfQU5EX1NFVF9O OgogICAgY2FzZSBCVUlMVF9JTl9MT0NLX1JFTEVBU0VfTjoKICAgICAgewoJ aW50IG4gPSBzeW5jX3Jlc29sdmVfc2l6ZSAoZnVuY3Rpb24sIHBhcmFtcyk7 Cgl0cmVlIG5ld19mdW5jdGlvbiwgcmVzdWx0OwoKCWlmIChuID09IDApCgkg IHJldHVybiBlcnJvcl9tYXJrX25vZGU7CgoJbmV3X2Z1bmN0aW9uID0gYnVp bHRfaW5fZGVjbHNbb3JpZ19jb2RlICsgZXhhY3RfbG9nMiAobikgKyAxXTsK CWlmICghc3luY19yZXNvbHZlX3BhcmFtcyAoZnVuY3Rpb24sIG5ld19mdW5j dGlvbiwgcGFyYW1zKSkKCSAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsKCgly ZXN1bHQgPSBidWlsZF9mdW5jdGlvbl9jYWxsIChuZXdfZnVuY3Rpb24sIHBh cmFtcyk7CglpZiAob3JpZ19jb2RlICE9IEJVSUxUX0lOX0JPT0xfQ09NUEFS RV9BTkRfU1dBUF9OCgkgICAgJiYgb3JpZ19jb2RlICE9IEJVSUxUX0lOX0xP Q0tfUkVMRUFTRV9OKQoJICByZXN1bHQgPSBzeW5jX3Jlc29sdmVfcmV0dXJu IChwYXJhbXMsIHJlc3VsdCk7CgoJcmV0dXJuIHJlc3VsdDsKICAgICAgfQoK ICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9Cn0K Ci8qIElnbm9yaW5nIHRoZWlyIHNpZ24sIHJldHVybiB0cnVlIGlmIHR3byBz Y2FsYXIgdHlwZXMgYXJlIHRoZSBzYW1lLiAgKi8KYm9vbApzYW1lX3NjYWxh cl90eXBlX2lnbm9yaW5nX3NpZ25lZG5lc3MgKHRyZWUgdDEsIHRyZWUgdDIp CnsKICBlbnVtIHRyZWVfY29kZSBjMSA9IFRSRUVfQ09ERSAodDEpLCBjMiA9 IFRSRUVfQ09ERSAodDIpOwoKICBnY2NfYXNzZXJ0ICgoYzEgPT0gSU5URUdF Ul9UWVBFIHx8IGMxID09IFJFQUxfVFlQRSB8fCBjMSA9PSBGSVhFRF9QT0lO VF9UWVBFKQoJICAgICAgJiYgKGMyID09IElOVEVHRVJfVFlQRSB8fCBjMiA9 PSBSRUFMX1RZUEUKCQkgIHx8IGMyID09IEZJWEVEX1BPSU5UX1RZUEUpKTsK CiAgLyogRXF1YWxpdHkgd29ya3MgaGVyZSBiZWNhdXNlIGNfY29tbW9uX3Np Z25lZF90eXBlIHVzZXMKICAgICBUWVBFX01BSU5fVkFSSUFOVC4gICovCiAg cmV0dXJuIGNfY29tbW9uX3NpZ25lZF90eXBlICh0MSkKICAgID09IGNfY29t bW9uX3NpZ25lZF90eXBlICh0Mik7Cn0KCi8qIENoZWNrIGZvciBtaXNzaW5n IGZvcm1hdCBhdHRyaWJ1dGVzIG9uIGZ1bmN0aW9uIHBvaW50ZXJzLiAgTFRZ UEUgaXMKICAgdGhlIG5ldyB0eXBlIG9yIGxlZnQtaGFuZCBzaWRlIHR5cGUu ICBSVFlQRSBpcyB0aGUgb2xkIHR5cGUgb3IKICAgcmlnaHQtaGFuZCBzaWRl IHR5cGUuICBSZXR1cm5zIFRSVUUgaWYgTFRZUEUgaXMgbWlzc2luZyB0aGUg ZGVzaXJlZAogICBhdHRyaWJ1dGUuICAqLwoKYm9vbApjaGVja19taXNzaW5n X2Zvcm1hdF9hdHRyaWJ1dGUgKHRyZWUgbHR5cGUsIHRyZWUgcnR5cGUpCnsK ICB0cmVlIGNvbnN0IHR0ciA9IFRSRUVfVFlQRSAocnR5cGUpLCB0dGwgPSBU UkVFX1RZUEUgKGx0eXBlKTsKICB0cmVlIHJhOwoKICBmb3IgKHJhID0gVFlQ RV9BVFRSSUJVVEVTICh0dHIpOyByYTsgcmEgPSBUUkVFX0NIQUlOIChyYSkp CiAgICBpZiAoaXNfYXR0cmlidXRlX3AgKCJmb3JtYXQiLCBUUkVFX1BVUlBP U0UgKHJhKSkpCiAgICAgIGJyZWFrOwogIGlmIChyYSkKICAgIHsKICAgICAg dHJlZSBsYTsKICAgICAgZm9yIChsYSA9IFRZUEVfQVRUUklCVVRFUyAodHRs KTsgbGE7IGxhID0gVFJFRV9DSEFJTiAobGEpKQoJaWYgKGlzX2F0dHJpYnV0 ZV9wICgiZm9ybWF0IiwgVFJFRV9QVVJQT1NFIChsYSkpKQoJICBicmVhazsK ICAgICAgcmV0dXJuICFsYTsKICAgIH0KICBlbHNlCiAgICByZXR1cm4gZmFs c2U7Cn0KCi8qIFN1YnNjcmlwdGluZyB3aXRoIHR5cGUgY2hhciBpcyBsaWtl bHkgdG8gbG9zZSBvbiBhIG1hY2hpbmUgd2hlcmUKICAgY2hhcnMgYXJlIHNp Z25lZC4gIFNvIHdhcm4gb24gYW55IG1hY2hpbmUsIGJ1dCBvcHRpb25hbGx5 LiAgRG9uJ3QKICAgd2FybiBmb3IgdW5zaWduZWQgY2hhciBzaW5jZSB0aGF0 IHR5cGUgaXMgc2FmZS4gIERvbid0IHdhcm4gZm9yCiAgIHNpZ25lZCBjaGFy IGJlY2F1c2UgYW55b25lIHdobyB1c2VzIHRoYXQgbXVzdCBoYXZlIGRvbmUg c28KICAgZGVsaWJlcmF0ZWx5LiBGdXJ0aGVybW9yZSwgd2UgcmVkdWNlIHRo ZSBmYWxzZSBwb3NpdGl2ZSBsb2FkIGJ5CiAgIHdhcm5pbmcgb25seSBmb3Ig bm9uLWNvbnN0YW50IHZhbHVlIG9mIHR5cGUgY2hhci4gICovCgp2b2lkCndh cm5fYXJyYXlfc3Vic2NyaXB0X3dpdGhfdHlwZV9jaGFyICh0cmVlIGluZGV4 KQp7CiAgaWYgKFRZUEVfTUFJTl9WQVJJQU5UIChUUkVFX1RZUEUgKGluZGV4 KSkgPT0gY2hhcl90eXBlX25vZGUKICAgICAgJiYgVFJFRV9DT0RFIChpbmRl eCkgIT0gSU5URUdFUl9DU1QpCiAgICB3YXJuaW5nIChPUFRfV2NoYXJfc3Vi c2NyaXB0cywgImFycmF5IHN1YnNjcmlwdCBoYXMgdHlwZSAlPGNoYXIlPiIp Owp9CgovKiBJbXBsZW1lbnQgLVdwYXJlbnRoZXNlcyBmb3IgdGhlIHVuZXhw ZWN0ZWQgQyBwcmVjZWRlbmNlIHJ1bGVzLCB0bwogICBjb3ZlciBjYXNlcyBs aWtlIHggKyB5IDw8IHogd2hpY2ggcmVhZGVycyBhcmUgbGlrZWx5IHRvCiAg IG1pc2ludGVycHJldC4gIFdlIGhhdmUgc2VlbiBhbiBleHByZXNzaW9uIGlu IHdoaWNoIENPREUgaXMgYSBiaW5hcnkKICAgb3BlcmF0b3IgdXNlZCB0byBj b21iaW5lIGV4cHJlc3Npb25zIGhlYWRlZCBieSBDT0RFX0xFRlQgYW5kCiAg IENPREVfUklHSFQuICBDT0RFX0xFRlQgYW5kIENPREVfUklHSFQgbWF5IGJl IEVSUk9SX01BUkssIHdoaWNoCiAgIG1lYW5zIHRoYXQgdGhhdCBzaWRlIG9m IHRoZSBleHByZXNzaW9uIHdhcyBub3QgZm9ybWVkIHVzaW5nIGEKICAgYmlu YXJ5IG9wZXJhdG9yLCBvciBpdCB3YXMgZW5jbG9zZWQgaW4gcGFyZW50aGVz ZXMuICAqLwoKdm9pZAp3YXJuX2Fib3V0X3BhcmVudGhlc2VzIChlbnVtIHRy ZWVfY29kZSBjb2RlLCBlbnVtIHRyZWVfY29kZSBjb2RlX2xlZnQsCgkJCWVu dW0gdHJlZV9jb2RlIGNvZGVfcmlnaHQpCnsKICBpZiAoIXdhcm5fcGFyZW50 aGVzZXMpCiAgICByZXR1cm47CgogIGlmIChjb2RlID09IExTSElGVF9FWFBS IHx8IGNvZGUgPT0gUlNISUZUX0VYUFIpCiAgICB7CiAgICAgIGlmIChjb2Rl X2xlZnQgPT0gUExVU19FWFBSIHx8IGNvZGVfbGVmdCA9PSBNSU5VU19FWFBS CgkgIHx8IGNvZGVfcmlnaHQgPT0gUExVU19FWFBSIHx8IGNvZGVfcmlnaHQg PT0gTUlOVVNfRVhQUikKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJ ICJzdWdnZXN0IHBhcmVudGhlc2VzIGFyb3VuZCArIG9yIC0gaW5zaWRlIHNo aWZ0Iik7CiAgICB9CgogIGlmIChjb2RlID09IFRSVVRIX09SSUZfRVhQUikK ICAgIHsKICAgICAgaWYgKGNvZGVfbGVmdCA9PSBUUlVUSF9BTkRJRl9FWFBS CgkgIHx8IGNvZGVfcmlnaHQgPT0gVFJVVEhfQU5ESUZfRVhQUikKCXdhcm5p bmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhlc2Vz IGFyb3VuZCAmJiB3aXRoaW4gfHwiKTsKICAgIH0KCiAgaWYgKGNvZGUgPT0g QklUX0lPUl9FWFBSKQogICAgewogICAgICBpZiAoY29kZV9sZWZ0ID09IEJJ VF9BTkRfRVhQUiB8fCBjb2RlX2xlZnQgPT0gQklUX1hPUl9FWFBSCgkgIHx8 IGNvZGVfbGVmdCA9PSBQTFVTX0VYUFIgfHwgY29kZV9sZWZ0ID09IE1JTlVT X0VYUFIKCSAgfHwgY29kZV9yaWdodCA9PSBCSVRfQU5EX0VYUFIgfHwgY29k ZV9yaWdodCA9PSBCSVRfWE9SX0VYUFIKCSAgfHwgY29kZV9yaWdodCA9PSBQ TFVTX0VYUFIgfHwgY29kZV9yaWdodCA9PSBNSU5VU19FWFBSKQoJd2Fybmlu ZyAoT1BUX1dwYXJlbnRoZXNlcywKCQkgInN1Z2dlc3QgcGFyZW50aGVzZXMg YXJvdW5kIGFyaXRobWV0aWMgaW4gb3BlcmFuZCBvZiB8Iik7CiAgICAgIC8q IENoZWNrIGNhc2VzIGxpa2UgeHx5PT16ICovCiAgICAgIGlmIChUUkVFX0NP REVfQ0xBU1MgKGNvZGVfbGVmdCkgPT0gdGNjX2NvbXBhcmlzb24KCSAgfHwg VFJFRV9DT0RFX0NMQVNTIChjb2RlX3JpZ2h0KSA9PSB0Y2NfY29tcGFyaXNv bikKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBh cmVudGhlc2VzIGFyb3VuZCBjb21wYXJpc29uIGluIG9wZXJhbmQgb2YgfCIp OwogICAgfQoKICBpZiAoY29kZSA9PSBCSVRfWE9SX0VYUFIpCiAgICB7CiAg ICAgIGlmIChjb2RlX2xlZnQgPT0gQklUX0FORF9FWFBSCgkgIHx8IGNvZGVf bGVmdCA9PSBQTFVTX0VYUFIgfHwgY29kZV9sZWZ0ID09IE1JTlVTX0VYUFIK CSAgfHwgY29kZV9yaWdodCA9PSBCSVRfQU5EX0VYUFIKCSAgfHwgY29kZV9y aWdodCA9PSBQTFVTX0VYUFIgfHwgY29kZV9yaWdodCA9PSBNSU5VU19FWFBS KQoJd2FybmluZyAoT1BUX1dwYXJlbnRoZXNlcywKCQkgInN1Z2dlc3QgcGFy ZW50aGVzZXMgYXJvdW5kIGFyaXRobWV0aWMgaW4gb3BlcmFuZCBvZiBeIik7 CiAgICAgIC8qIENoZWNrIGNhc2VzIGxpa2UgeF55PT16ICovCiAgICAgIGlm IChUUkVFX0NPREVfQ0xBU1MgKGNvZGVfbGVmdCkgPT0gdGNjX2NvbXBhcmlz b24KCSAgfHwgVFJFRV9DT0RFX0NMQVNTIChjb2RlX3JpZ2h0KSA9PSB0Y2Nf Y29tcGFyaXNvbikKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJz dWdnZXN0IHBhcmVudGhlc2VzIGFyb3VuZCBjb21wYXJpc29uIGluIG9wZXJh bmQgb2YgXiIpOwogICAgfQoKICBpZiAoY29kZSA9PSBCSVRfQU5EX0VYUFIp CiAgICB7CiAgICAgIGlmIChjb2RlX2xlZnQgPT0gUExVU19FWFBSIHx8IGNv ZGVfbGVmdCA9PSBNSU5VU19FWFBSCgkgIHx8IGNvZGVfcmlnaHQgPT0gUExV U19FWFBSIHx8IGNvZGVfcmlnaHQgPT0gTUlOVVNfRVhQUikKCXdhcm5pbmcg KE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhlc2VzIGFy b3VuZCArIG9yIC0gaW4gb3BlcmFuZCBvZiAmIik7CiAgICAgIC8qIENoZWNr IGNhc2VzIGxpa2UgeCZ5PT16ICovCiAgICAgIGlmIChUUkVFX0NPREVfQ0xB U1MgKGNvZGVfbGVmdCkgPT0gdGNjX2NvbXBhcmlzb24KCSAgfHwgVFJFRV9D T0RFX0NMQVNTIChjb2RlX3JpZ2h0KSA9PSB0Y2NfY29tcGFyaXNvbikKCXdh cm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhl c2VzIGFyb3VuZCBjb21wYXJpc29uIGluIG9wZXJhbmQgb2YgJiIpOwogICAg fQoKICBpZiAoY29kZSA9PSBFUV9FWFBSIHx8IGNvZGUgPT0gTkVfRVhQUikK ICAgIHsKICAgICAgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29kZV9sZWZ0KSA9 PSB0Y2NfY29tcGFyaXNvbgogICAgICAgICAgfHwgVFJFRV9DT0RFX0NMQVNT IChjb2RlX3JpZ2h0KSA9PSB0Y2NfY29tcGFyaXNvbikKCXdhcm5pbmcgKE9Q VF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhlc2VzIGFyb3Vu ZCBjb21wYXJpc29uIGluIG9wZXJhbmQgb2YgJXMiLAogICAgICAgICAgICAg ICAgIGNvZGUgPT0gRVFfRVhQUiA/ICI9PSIgOiAiIT0iKTsKICAgIH0KICBl bHNlIGlmIChUUkVFX0NPREVfQ0xBU1MgKGNvZGUpID09IHRjY19jb21wYXJp c29uKQogICAgewogICAgICBpZiAoKFRSRUVfQ09ERV9DTEFTUyAoY29kZV9s ZWZ0KSA9PSB0Y2NfY29tcGFyaXNvbgoJICAgJiYgY29kZV9sZWZ0ICE9IE5F X0VYUFIgJiYgY29kZV9sZWZ0ICE9IEVRX0VYUFIpCgkgIHx8IChUUkVFX0NP REVfQ0xBU1MgKGNvZGVfcmlnaHQpID09IHRjY19jb21wYXJpc29uCgkgICAg ICAmJiBjb2RlX3JpZ2h0ICE9IE5FX0VYUFIgJiYgY29kZV9yaWdodCAhPSBF UV9FWFBSKSkKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsICJjb21wYXJp c29ucyBsaWtlIFg8PVk8PVogZG8gbm90ICIKCQkgImhhdmUgdGhlaXIgbWF0 aGVtYXRpY2FsIG1lYW5pbmciKTsKICAgIH0KfQoKLyogSWYgTEFCRUwgKGEg TEFCRUxfREVDTCkgaGFzIG5vdCBiZWVuIHVzZWQsIGlzc3VlIGEgd2Fybmlu Zy4gICovCgp2b2lkCndhcm5fZm9yX3VudXNlZF9sYWJlbCAodHJlZSBsYWJl bCkKewogIGlmICghVFJFRV9VU0VEIChsYWJlbCkpCiAgICB7CiAgICAgIGlm IChERUNMX0lOSVRJQUwgKGxhYmVsKSkKCXdhcm5pbmcgKE9QVF9XdW51c2Vk X2xhYmVsLCAibGFiZWwgJXErRCBkZWZpbmVkIGJ1dCBub3QgdXNlZCIsIGxh YmVsKTsKICAgICAgZWxzZQogICAgICAgIHdhcm5pbmcgKE9QVF9XdW51c2Vk X2xhYmVsLCAibGFiZWwgJXErRCBkZWNsYXJlZCBidXQgbm90IGRlZmluZWQi LCBsYWJlbCk7CiAgICB9Cn0KCiNpZm5kZWYgVEFSR0VUX0hBU19UQVJHRVRD TQpzdHJ1Y3QgZ2NjX3RhcmdldGNtIHRhcmdldGNtID0gVEFSR0VUQ01fSU5J VElBTElaRVI7CiNlbmRpZgoKLyogV2FybiBmb3IgZGl2aXNpb24gYnkgemVy byBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIERJVklTT1IuICAqLwoKdm9p ZAp3YXJuX2Zvcl9kaXZfYnlfemVybyAodHJlZSBkaXZpc29yKQp7CiAgLyog SWYgRElWSVNPUiBpcyB6ZXJvLCBhbmQgaGFzIGludGVncmFsIG9yIGZpeGVk LXBvaW50IHR5cGUsIGlzc3VlIGEgd2FybmluZwogICAgIGFib3V0IGRpdmlz aW9uIGJ5IHplcm8uICBEbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIERJVklT T1IgaGFzIGEKICAgICBmbG9hdGluZy1wb2ludCB0eXBlLCBzaW5jZSB3ZSBj b25zaWRlciAwLjAvMC4wIGEgdmFsaWQgd2F5IG9mCiAgICAgZ2VuZXJhdGlu ZyBhIE5hTi4gICovCiAgaWYgKHNraXBfZXZhbHVhdGlvbiA9PSAwCiAgICAg ICYmIChpbnRlZ2VyX3plcm9wIChkaXZpc29yKSB8fCBmaXhlZF96ZXJvcCAo ZGl2aXNvcikpKQogICAgd2FybmluZyAoT1BUX1dkaXZfYnlfemVybywgImRp dmlzaW9uIGJ5IHplcm8iKTsKfQoKI2luY2x1ZGUgImd0LWMtY29tbW9uLmgi Cg== ------=_Part_22193_3060233.1195871607556-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14715 invoked by alias); 24 Nov 2007 02:44:26 -0000 Received: (qmail 14671 invoked by uid 22791); 24 Nov 2007 02:44:06 -0000 X-Spam-Check-By: sourceware.org Received: from rv-out-0910.google.com (HELO rv-out-0910.google.com) (209.85.198.189) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 24 Nov 2007 02:43:32 +0000 Received: by rv-out-0910.google.com with SMTP id f5so1759rvb for ; Fri, 23 Nov 2007 18:43:29 -0800 (PST) Received: by 10.140.136.6 with SMTP id j6mr3681rvd.1195871607603; Fri, 23 Nov 2007 18:33:27 -0800 (PST) Received: by 10.141.19.8 with HTTP; Fri, 23 Nov 2007 18:33:27 -0800 (PST) Message-ID: <6c33472e0711231833m46b9c70u75e99fd37e0b3852@mail.gmail.com> Date: Sat, 24 Nov 2007 13:21:00 -0000 From: "=?ISO-8859-1?Q?Manuel_L=F3pez-Ib=E1=F1ez?=" To: "GCC Patches" Subject: simplify conversion_warning Cc: "Joseph S. Myers" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_22193_3060233.1195871607556" X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2007-11/txt/msg01276.txt.bz2 Message-ID: <20071124132100.osyEmT_36QMXMorXi6eTtZJwRzMMUCNrMhL71TBn--k@z> ------=_Part_22193_3060233.1195871607556 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 989 :ADDPATCH: The fix for PR c++/34198 used get_narrowed. By using get_unwidened the code is much simpler and easier to understand. Jakub mentions this alternative here: http://gcc.gnu.org/ml/gcc-patches/2007-11/msg01227.html > But get_narrower has the advantage of getting through multiple > conversions of the same precision, in case we decide e.g. to > further optimize away the warning for BIT_AND_EXPR where > one of the operands is INTEGER_CST mask which fits into > type. I don't see this as much as an advantage at the present moment since we are not looking inside expressions (and it seems unlikely that we will do it in the near future). And if we do it, all that code (including the narrowing magic) would be better in a separate function. So I think it is better to keep the code as simpler as possible. Bootstrapped and regression tested. 2007-11-24 Manuel Lopez-Ibanez * c-common.c (conversion_warning): Use get_unwidened instead of get_narrower. ------=_Part_22193_3060233.1195871607556 Content-Type: text/x-csrc; name=c-common.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_f9dj07gs Content-Disposition: attachment; filename=c-common.c Content-length: 314460 LyogU3Vicm91dGluZXMgc2hhcmVkIGJ5IGFsbCBsYW5ndWFnZXMgdGhhdCBh cmUgdmFyaWFudHMgb2YgQy4KICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkz LCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAog ICAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKVGhpcyBmaWxlIGlzIHBh cnQgb2YgR0NDLgoKR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKdmVyc2lv bi4KCkdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJ VFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmZvciBtb3JlIGRldGFp bHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIEdDQzsgc2Vl IHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQo8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoj aW5jbHVkZSAic3lzdGVtLmgiCiNpbmNsdWRlICJjb3JldHlwZXMuaCIKI2lu Y2x1ZGUgInRtLmgiCiNpbmNsdWRlICJpbnRsLmgiCiNpbmNsdWRlICJ0cmVl LmgiCiNpbmNsdWRlICJmbGFncy5oIgojaW5jbHVkZSAib3V0cHV0LmgiCiNp bmNsdWRlICJjLXByYWdtYS5oIgojaW5jbHVkZSAicnRsLmgiCiNpbmNsdWRl ICJnZ2MuaCIKI2luY2x1ZGUgInZhcnJheS5oIgojaW5jbHVkZSAiZXhwci5o IgojaW5jbHVkZSAiYy1jb21tb24uaCIKI2luY2x1ZGUgImRpYWdub3N0aWMu aCIKI2luY2x1ZGUgInRtX3AuaCIKI2luY2x1ZGUgIm9ic3RhY2suaCIKI2lu Y2x1ZGUgImNwcGxpYi5oIgojaW5jbHVkZSAidGFyZ2V0LmgiCiNpbmNsdWRl ICJsYW5naG9va3MuaCIKI2luY2x1ZGUgInRyZWUtaW5saW5lLmgiCiNpbmNs dWRlICJjLXRyZWUuaCIKI2luY2x1ZGUgInRvcGxldi5oIgojaW5jbHVkZSAi dHJlZS1pdGVyYXRvci5oIgojaW5jbHVkZSAiaGFzaHRhYi5oIgojaW5jbHVk ZSAidHJlZS1tdWRmbGFwLmgiCiNpbmNsdWRlICJvcHRzLmgiCiNpbmNsdWRl ICJyZWFsLmgiCiNpbmNsdWRlICJjZ3JhcGguaCIKI2luY2x1ZGUgInRhcmdl dC1kZWYuaCIKI2luY2x1ZGUgImZpeGVkLXZhbHVlLmgiCgpjcHBfcmVhZGVy ICpwYXJzZV9pbjsJCS8qIERlY2xhcmVkIGluIGMtcHJhZ21hLmguICAqLwoK LyogV2UgbGV0IHRtLmggb3ZlcnJpZGUgdGhlIHR5cGVzIHVzZWQgaGVyZSwg dG8gaGFuZGxlIHRyaXZpYWwgZGlmZmVyZW5jZXMKICAgc3VjaCBhcyB0aGUg Y2hvaWNlIG9mIHVuc2lnbmVkIGludCBvciBsb25nIHVuc2lnbmVkIGludCBm b3Igc2l6ZV90LgogICBXaGVuIG1hY2hpbmVzIHN0YXJ0IG5lZWRpbmcgbm9u dHJpdmlhbCBkaWZmZXJlbmNlcyBpbiB0aGUgc2l6ZSB0eXBlLAogICBpdCB3 b3VsZCBiZSBiZXN0IHRvIGRvIHNvbWV0aGluZyBoZXJlIHRvIGZpZ3VyZSBv dXQgYXV0b21hdGljYWxseQogICBmcm9tIG90aGVyIGluZm9ybWF0aW9uIHdo YXQgdHlwZSB0byB1c2UuICAqLwoKI2lmbmRlZiBTSVpFX1RZUEUKI2RlZmlu ZSBTSVpFX1RZUEUgImxvbmcgdW5zaWduZWQgaW50IgojZW5kaWYKCiNpZm5k ZWYgUElEX1RZUEUKI2RlZmluZSBQSURfVFlQRSAiaW50IgojZW5kaWYKCiNp Zm5kZWYgV0NIQVJfVFlQRQojZGVmaW5lIFdDSEFSX1RZUEUgImludCIKI2Vu ZGlmCgovKiBXQ0hBUl9UWVBFIGdldHMgb3ZlcnJpZGRlbiBieSAtZnNob3J0 LXdjaGFyLiAgKi8KI2RlZmluZSBNT0RJRklFRF9XQ0hBUl9UWVBFIFwKCShm bGFnX3Nob3J0X3djaGFyID8gInNob3J0IHVuc2lnbmVkIGludCIgOiBXQ0hB Ul9UWVBFKQoKI2lmbmRlZiBQVFJESUZGX1RZUEUKI2RlZmluZSBQVFJESUZG X1RZUEUgImxvbmcgaW50IgojZW5kaWYKCiNpZm5kZWYgV0lOVF9UWVBFCiNk ZWZpbmUgV0lOVF9UWVBFICJ1bnNpZ25lZCBpbnQiCiNlbmRpZgoKI2lmbmRl ZiBJTlRNQVhfVFlQRQojZGVmaW5lIElOVE1BWF9UWVBFICgoSU5UX1RZUEVf U0laRSA9PSBMT05HX0xPTkdfVFlQRV9TSVpFKQlcCgkJICAgICA/ICJpbnQi CQkJCQlcCgkJICAgICA6ICgoTE9OR19UWVBFX1NJWkUgPT0gTE9OR19MT05H X1RZUEVfU0laRSkJXAoJCQk/ICJsb25nIGludCIJCQkJXAoJCQk6ICJsb25n IGxvbmcgaW50IikpCiNlbmRpZgoKI2lmbmRlZiBVSU5UTUFYX1RZUEUKI2Rl ZmluZSBVSU5UTUFYX1RZUEUgKChJTlRfVFlQRV9TSVpFID09IExPTkdfTE9O R19UWVBFX1NJWkUpCVwKCQkgICAgID8gInVuc2lnbmVkIGludCIJCQkJXAoJ CSAgICAgOiAoKExPTkdfVFlQRV9TSVpFID09IExPTkdfTE9OR19UWVBFX1NJ WkUpCVwKCQkJPyAibG9uZyB1bnNpZ25lZCBpbnQiCQkJXAoJCQk6ICJsb25n IGxvbmcgdW5zaWduZWQgaW50IikpCiNlbmRpZgoKLyogVGhlIGZvbGxvd2lu ZyBzeW1ib2xzIGFyZSBzdWJzdW1lZCBpbiB0aGUgY19nbG9iYWxfdHJlZXMg YXJyYXksIGFuZAogICBsaXN0ZWQgaGVyZSBpbmRpdmlkdWFsbHkgZm9yIGRv Y3VtZW50YXRpb24gcHVycG9zZXMuCgogICBJTlRFR0VSX1RZUEUgYW5kIFJF QUxfVFlQRSBub2RlcyBmb3IgdGhlIHN0YW5kYXJkIGRhdGEgdHlwZXMuCgoJ dHJlZSBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZTsKCXRyZWUgbG9uZ19pbnRl Z2VyX3R5cGVfbm9kZTsKCXRyZWUgbG9uZ19sb25nX2ludGVnZXJfdHlwZV9u b2RlOwoKCXRyZWUgc2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlOwoJdHJlZSBs b25nX3Vuc2lnbmVkX3R5cGVfbm9kZTsKCXRyZWUgbG9uZ19sb25nX3Vuc2ln bmVkX3R5cGVfbm9kZTsKCgl0cmVlIHRydXRodmFsdWVfdHlwZV9ub2RlOwoJ dHJlZSB0cnV0aHZhbHVlX2ZhbHNlX25vZGU7Cgl0cmVlIHRydXRodmFsdWVf dHJ1ZV9ub2RlOwoKCXRyZWUgcHRyZGlmZl90eXBlX25vZGU7CgoJdHJlZSB1 bnNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKCXRyZWUgc2lnbmVkX2NoYXJfdHlw ZV9ub2RlOwoJdHJlZSB3Y2hhcl90eXBlX25vZGU7Cgl0cmVlIHNpZ25lZF93 Y2hhcl90eXBlX25vZGU7Cgl0cmVlIHVuc2lnbmVkX3djaGFyX3R5cGVfbm9k ZTsKCgl0cmVlIGZsb2F0X3R5cGVfbm9kZTsKCXRyZWUgZG91YmxlX3R5cGVf bm9kZTsKCXRyZWUgbG9uZ19kb3VibGVfdHlwZV9ub2RlOwoKCXRyZWUgY29t cGxleF9pbnRlZ2VyX3R5cGVfbm9kZTsKCXRyZWUgY29tcGxleF9mbG9hdF90 eXBlX25vZGU7Cgl0cmVlIGNvbXBsZXhfZG91YmxlX3R5cGVfbm9kZTsKCXRy ZWUgY29tcGxleF9sb25nX2RvdWJsZV90eXBlX25vZGU7CgoJdHJlZSBkZmxv YXQzMl90eXBlX25vZGU7Cgl0cmVlIGRmbG9hdDY0X3R5cGVfbm9kZTsKCXRy ZWVfZGZsb2F0MTI4X3R5cGVfbm9kZTsKCgl0cmVlIGludFFJX3R5cGVfbm9k ZTsKCXRyZWUgaW50SElfdHlwZV9ub2RlOwoJdHJlZSBpbnRTSV90eXBlX25v ZGU7Cgl0cmVlIGludERJX3R5cGVfbm9kZTsKCXRyZWUgaW50VElfdHlwZV9u b2RlOwoKCXRyZWUgdW5zaWduZWRfaW50UUlfdHlwZV9ub2RlOwoJdHJlZSB1 bnNpZ25lZF9pbnRISV90eXBlX25vZGU7Cgl0cmVlIHVuc2lnbmVkX2ludFNJ X3R5cGVfbm9kZTsKCXRyZWUgdW5zaWduZWRfaW50RElfdHlwZV9ub2RlOwoJ dHJlZSB1bnNpZ25lZF9pbnRUSV90eXBlX25vZGU7CgoJdHJlZSB3aWRlc3Rf aW50ZWdlcl9saXRlcmFsX3R5cGVfbm9kZTsKCXRyZWUgd2lkZXN0X3Vuc2ln bmVkX2xpdGVyYWxfdHlwZV9ub2RlOwoKICAgTm9kZXMgZm9yIHR5cGVzIGB2 b2lkIConIGFuZCBgY29uc3Qgdm9pZCAqJy4KCgl0cmVlIHB0cl90eXBlX25v ZGUsIGNvbnN0X3B0cl90eXBlX25vZGU7CgogICBOb2RlcyBmb3IgdHlwZXMg YGNoYXIgKicgYW5kIGBjb25zdCBjaGFyIConLgoKCXRyZWUgc3RyaW5nX3R5 cGVfbm9kZSwgY29uc3Rfc3RyaW5nX3R5cGVfbm9kZTsKCiAgIFR5cGUgYGNo YXJbU09NRU5VTUJFUl0nLgogICBVc2VkIHdoZW4gYW4gYXJyYXkgb2YgY2hh ciBpcyBuZWVkZWQgYW5kIHRoZSBzaXplIGlzIGlycmVsZXZhbnQuCgoJdHJl ZSBjaGFyX2FycmF5X3R5cGVfbm9kZTsKCiAgIFR5cGUgYGludFtTT01FTlVN QkVSXScgb3Igc29tZXRoaW5nIGxpa2UgaXQuCiAgIFVzZWQgd2hlbiBhbiBh cnJheSBvZiBpbnQgbmVlZGVkIGFuZCB0aGUgc2l6ZSBpcyBpcnJlbGV2YW50 LgoKCXRyZWUgaW50X2FycmF5X3R5cGVfbm9kZTsKCiAgIFR5cGUgYHdjaGFy X3RbU09NRU5VTUJFUl0nIG9yIHNvbWV0aGluZyBsaWtlIGl0LgogICBVc2Vk IHdoZW4gYSB3aWRlIHN0cmluZyBsaXRlcmFsIGlzIGNyZWF0ZWQuCgoJdHJl ZSB3Y2hhcl9hcnJheV90eXBlX25vZGU7CgogICBUeXBlIGBpbnQgKCknIC0t IHVzZWQgZm9yIGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9ucy4K Cgl0cmVlIGRlZmF1bHRfZnVuY3Rpb25fdHlwZTsKCiAgIEEgVk9JRF9UWVBF IG5vZGUsIHBhY2thZ2VkIGluIGEgVFJFRV9MSVNULgoKCXRyZWUgdm9pZF9s aXN0X25vZGU7CgogIFRoZSBsYXppbHkgY3JlYXRlZCBWQVJfREVDTHMgZm9y IF9fRlVOQ1RJT05fXywgX19QUkVUVFlfRlVOQ1RJT05fXywKICBhbmQgX19m dW5jX18uIChDIGRvZXNuJ3QgZ2VuZXJhdGUgX19GVU5DVElPTl9fIGFuZF9f UFJFVFRZX0ZVTkNUSU9OX18KICBWQVJfREVDTFMsIGJ1dCBDKysgZG9lcy4p CgoJdHJlZSBmdW5jdGlvbl9uYW1lX2RlY2xfbm9kZTsKCXRyZWUgcHJldHR5 X2Z1bmN0aW9uX25hbWVfZGVjbF9ub2RlOwoJdHJlZSBjOTlfZnVuY3Rpb25f bmFtZV9kZWNsX25vZGU7CgogIFN0YWNrIG9mIG5lc3RlZCBmdW5jdGlvbiBu YW1lIFZBUl9ERUNMcy4KCgl0cmVlIHNhdmVkX2Z1bmN0aW9uX25hbWVfZGVj bHM7CgoqLwoKdHJlZSBjX2dsb2JhbF90cmVlc1tDVElfTUFYXTsKDAovKiBT d2l0Y2hlcyBjb21tb24gdG8gdGhlIEMgZnJvbnQgZW5kcy4gICovCgovKiBO b256ZXJvIGlmIHByZXByZXByb2Nlc3Npbmcgb25seS4gICovCgppbnQgZmxh Z19wcmVwcm9jZXNzX29ubHk7CgovKiBOb256ZXJvIG1lYW5zIGRvbid0IG91 dHB1dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCgpjaGFyIGZsYWdf bm9fbGluZV9jb21tYW5kczsKCi8qIE5vbnplcm8gY2F1c2VzIC1FIG91dHB1 dCBub3QgdG8gYmUgZG9uZSwgYnV0IGRpcmVjdGl2ZXMgc3VjaCBhcwogICAj ZGVmaW5lIHRoYXQgaGF2ZSBzaWRlIGVmZmVjdHMgYXJlIHN0aWxsIG9iZXll ZC4gICovCgpjaGFyIGZsYWdfbm9fb3V0cHV0OwoKLyogTm9uemVybyBtZWFu cyBkdW1wIG1hY3JvcyBpbiBzb21lIGZhc2hpb24uICAqLwoKY2hhciBmbGFn X2R1bXBfbWFjcm9zOwoKLyogTm9uemVybyBtZWFucyBwYXNzICNpbmNsdWRl IGxpbmVzIHRocm91Z2ggdG8gdGhlIG91dHB1dC4gICovCgpjaGFyIGZsYWdf ZHVtcF9pbmNsdWRlczsKCi8qIE5vbnplcm8gbWVhbnMgcHJvY2VzcyBQQ0gg ZmlsZXMgd2hpbGUgcHJlcHJvY2Vzc2luZy4gICovCgpib29sIGZsYWdfcGNo X3ByZXByb2Nlc3M7CgovKiBUaGUgZmlsZSBuYW1lIHRvIHdoaWNoIHdlIHNo b3VsZCB3cml0ZSBhIHByZWNvbXBpbGVkIGhlYWRlciwgb3IKICAgTlVMTCBp ZiBubyBoZWFkZXIgd2lsbCBiZSB3cml0dGVuIGluIHRoaXMgY29tcGlsZS4g ICovCgpjb25zdCBjaGFyICpwY2hfZmlsZTsKCi8qIE5vbnplcm8gaWYgYW4g SVNPIHN0YW5kYXJkIHdhcyBzZWxlY3RlZC4gIEl0IHJlamVjdHMgbWFjcm9z IGluIHRoZQogICB1c2VyJ3MgbmFtZXNwYWNlLiAgKi8KaW50IGZsYWdfaXNv OwoKLyogTm9uemVybyBpZiAtdW5kZWYgd2FzIGdpdmVuLiAgSXQgc3VwcHJl c3NlcyB0YXJnZXQgYnVpbHQtaW4gbWFjcm9zCiAgIGFuZCBhc3NlcnRpb25z LiAgKi8KaW50IGZsYWdfdW5kZWY7CgovKiBOb256ZXJvIG1lYW5zIGRvbid0 IHJlY29nbml6ZSB0aGUgbm9uLUFOU0kgYnVpbHRpbiBmdW5jdGlvbnMuICAq LwoKaW50IGZsYWdfbm9fYnVpbHRpbjsKCi8qIE5vbnplcm8gbWVhbnMgZG9u J3QgcmVjb2duaXplIHRoZSBub24tQU5TSSBidWlsdGluIGZ1bmN0aW9ucy4K ICAgLWFuc2kgc2V0cyB0aGlzLiAgKi8KCmludCBmbGFnX25vX25vbmFuc2lf YnVpbHRpbjsKCi8qIE5vbnplcm8gbWVhbnMgZ2l2ZSBgZG91YmxlJyB0aGUg c2FtZSBzaXplIGFzIGBmbG9hdCcuICAqLwoKaW50IGZsYWdfc2hvcnRfZG91 YmxlOwoKLyogTm9uemVybyBtZWFucyBnaXZlIGB3Y2hhcl90JyB0aGUgc2Ft ZSBzaXplIGFzIGBzaG9ydCcuICAqLwoKaW50IGZsYWdfc2hvcnRfd2NoYXI7 CgovKiBOb256ZXJvIG1lYW5zIGFsbG93IGltcGxpY2l0IGNvbnZlcnNpb25z IGJldHdlZW4gdmVjdG9ycyB3aXRoCiAgIGRpZmZlcmluZyBudW1iZXJzIG9m IHN1YnBhcnRzIGFuZC9vciBkaWZmZXJpbmcgZWxlbWVudCB0eXBlcy4gICov CmludCBmbGFnX2xheF92ZWN0b3JfY29udmVyc2lvbnM7CgovKiBOb256ZXJv IG1lYW5zIGFsbG93IE1pY3Jvc29mdCBleHRlbnNpb25zIHdpdGhvdXQgd2Fy bmluZ3Mgb3IgZXJyb3JzLiAgKi8KaW50IGZsYWdfbXNfZXh0ZW5zaW9uczsK Ci8qIE5vbnplcm8gbWVhbnMgZG9uJ3QgcmVjb2duaXplIHRoZSBrZXl3b3Jk IGBhc20nLiAgKi8KCmludCBmbGFnX25vX2FzbTsKCi8qIE5vbnplcm8gbWVh bnMgdG8gdHJlYXQgYml0ZmllbGRzIGFzIHNpZ25lZCB1bmxlc3MgdGhleSBz YXkgYHVuc2lnbmVkJy4gICovCgppbnQgZmxhZ19zaWduZWRfYml0ZmllbGRz ID0gMTsKCi8qIFdhcm4gYWJvdXQgI3ByYWdtYSBkaXJlY3RpdmVzIHRoYXQg YXJlIG5vdCByZWNvZ25pemVkLiAgKi8KCmludCB3YXJuX3Vua25vd25fcHJh Z21hczsgLyogVHJpIHN0YXRlIHZhcmlhYmxlLiAgKi8KCi8qIFdhcm4gYWJv dXQgZm9ybWF0L2FyZ3VtZW50IGFub21hbGllcyBpbiBjYWxscyB0byBmb3Jt YXR0ZWQgSS9PIGZ1bmN0aW9ucwogICAoKnByaW50ZiwgKnNjYW5mLCBzdHJm dGltZSwgc3RyZm1vbiwgZXRjLikuICAqLwoKaW50IHdhcm5fZm9ybWF0OwoK LyogV2FybiBhYm91dCB1c2luZyBfX251bGwgKGFzIE5VTEwgaW4gQysrKSBh cyBzZW50aW5lbC4gIEZvciBjb2RlIGNvbXBpbGVkCiAgIHdpdGggR0NDIHRo aXMgZG9lc24ndCBtYXR0ZXIgYXMgX19udWxsIGlzIGd1YXJhbnRlZWQgdG8g aGF2ZSB0aGUgcmlnaHQKICAgc2l6ZS4gICovCgppbnQgd2Fybl9zdHJpY3Rf bnVsbF9zZW50aW5lbDsKCi8qIFplcm8gbWVhbnMgdGhhdCBmYXN0ZXIsIC4u Lk5vbk5pbCB2YXJpYW50cyBvZiBvYmpjX21zZ1NlbmQuLi4KICAgY2FsbHMg d2lsbCBiZSB1c2VkIGluIE9iakM7IHBhc3NpbmcgbmlsIHJlY2VpdmVycyB0 byBzdWNoIGNhbGxzCiAgIHdpbGwgbW9zdCBsaWtlbHkgcmVzdWx0IGluIGNy YXNoZXMuICAqLwppbnQgZmxhZ19uaWxfcmVjZWl2ZXJzID0gMTsKCi8qIE5v bnplcm8gbWVhbnMgdGhhdCBjb2RlIGdlbmVyYXRpb24gd2lsbCBiZSBhbHRl cmVkIHRvIHN1cHBvcnQKICAgInplcm8tbGluayIgZXhlY3V0aW9uLiAgVGhp cyBjdXJyZW50bHkgYWZmZWN0cyBPYmpDIG9ubHksIGJ1dCBtYXkKICAgYWZm ZWN0IG90aGVyIGxhbmd1YWdlcyBpbiB0aGUgZnV0dXJlLiAgKi8KaW50IGZs YWdfemVyb19saW5rID0gMDsKCi8qIE5vbnplcm8gbWVhbnMgZW1pdCBhbiAn X19PQkpDLCBfX2ltYWdlX2luZm8nIGZvciB0aGUgY3VycmVudCB0cmFuc2xh dGlvbgogICB1bml0LiAgSXQgd2lsbCBpbmZvcm0gdGhlIE9iakMgcnVudGlt ZSB0aGF0IGNsYXNzIGRlZmluaXRpb24ocykgaGVyZWluCiAgIGNvbnRhaW5l ZCBhcmUgdG8gcmVwbGFjZSBvbmUocykgcHJldmlvdXNseSBsb2FkZWQuICAq LwppbnQgZmxhZ19yZXBsYWNlX29iamNfY2xhc3NlcyA9IDA7CgovKiBDL09i akMgbGFuZ3VhZ2Ugb3B0aW9uIHZhcmlhYmxlcy4gICovCgoKLyogTm9uemVy byBtZWFucyBhbGxvdyB0eXBlIG1pc21hdGNoZXMgaW4gY29uZGl0aW9uYWwg ZXhwcmVzc2lvbnM7CiAgIGp1c3QgbWFrZSB0aGVpciB2YWx1ZXMgYHZvaWQn LiAgKi8KCmludCBmbGFnX2NvbmRfbWlzbWF0Y2g7CgovKiBOb256ZXJvIG1l YW5zIGVuYWJsZSBDODkgQW1lbmRtZW50IDEgZmVhdHVyZXMuICAqLwoKaW50 IGZsYWdfaXNvYzk0OwoKLyogTm9uemVybyBtZWFucyB1c2UgdGhlIElTTyBD OTkgZGlhbGVjdCBvZiBDLiAgKi8KCmludCBmbGFnX2lzb2M5OTsKCi8qIE5v bnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGJ1aWx0aW4gZnVuY3Rpb25zLCBh bmQgbWFpbiBpcyBhbiBpbnQuICAqLwoKaW50IGZsYWdfaG9zdGVkID0gMTsK Ci8qIFdhcm4gaWYgbWFpbiBpcyBzdXNwaWNpb3VzLiAgKi8KCmludCB3YXJu X21haW47CgoKLyogT2JqQyBsYW5ndWFnZSBvcHRpb24gdmFyaWFibGVzLiAg Ki8KCgovKiBPcGVuIGFuZCBjbG9zZSB0aGUgZmlsZSBmb3Igb3V0cHV0dGlu ZyBjbGFzcyBkZWNsYXJhdGlvbnMsIGlmCiAgIHJlcXVlc3RlZCAoT2JqQyku ICAqLwoKaW50IGZsYWdfZ2VuX2RlY2xhcmF0aW9uOwoKLyogVGVsbHMgdGhl IGNvbXBpbGVyIHRoYXQgdGhpcyBpcyBhIHNwZWNpYWwgcnVuLiAgRG8gbm90 IHBlcmZvcm0gYW55CiAgIGNvbXBpbGluZywgaW5zdGVhZCB3ZSBhcmUgdG8g dGVzdCBzb21lIHBsYXRmb3JtIGRlcGVuZGVudCBmZWF0dXJlcwogICBhbmQg b3V0cHV0IGEgQyBoZWFkZXIgZmlsZSB3aXRoIGFwcHJvcHJpYXRlIGRlZmlu aXRpb25zLiAgKi8KCmludCBwcmludF9zdHJ1Y3RfdmFsdWVzOwoKLyogVGVs bHMgdGhlIGNvbXBpbGVyIHdoYXQgaXMgdGhlIGNvbnN0YW50IHN0cmluZyBj bGFzcyBmb3IgT2JqYy4gICovCgpjb25zdCBjaGFyICpjb25zdGFudF9zdHJp bmdfY2xhc3NfbmFtZTsKCgovKiBDKysgbGFuZ3VhZ2Ugb3B0aW9uIHZhcmlh Ymxlcy4gICovCgoKLyogTm9uemVybyBtZWFucyBkb24ndCByZWNvZ25pemUg YW55IGV4dGVuc2lvbiBrZXl3b3Jkcy4gICovCgppbnQgZmxhZ19ub19nbnVf a2V5d29yZHM7CgovKiBOb256ZXJvIG1lYW5zIGRvIGVtaXQgZXhwb3J0ZWQg aW1wbGVtZW50YXRpb25zIG9mIGZ1bmN0aW9ucyBldmVuIGlmCiAgIHRoZXkg Y2FuIGJlIGlubGluZWQuICAqLwoKaW50IGZsYWdfaW1wbGVtZW50X2lubGlu ZXMgPSAxOwoKLyogTm9uemVybyBtZWFucyB0aGF0IGltcGxpY2l0IGluc3Rh bnRpYXRpb25zIHdpbGwgYmUgZW1pdHRlZCBpZiBuZWVkZWQuICAqLwoKaW50 IGZsYWdfaW1wbGljaXRfdGVtcGxhdGVzID0gMTsKCi8qIE5vbnplcm8gbWVh bnMgdGhhdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBvZiBpbmxpbmUgdGVt cGxhdGVzIHdpbGwgYmUKICAgZW1pdHRlZCBpZiBuZWVkZWQsIGV2ZW4gaWYg aW5zdGFudGlhdGlvbnMgb2Ygbm9uLWlubGluZSB0ZW1wbGF0ZXMKICAgYXJl bid0LiAgKi8KCmludCBmbGFnX2ltcGxpY2l0X2lubGluZV90ZW1wbGF0ZXMg PSAxOwoKLyogTm9uemVybyBtZWFucyBnZW5lcmF0ZSBzZXBhcmF0ZSBpbnN0 YW50aWF0aW9uIGNvbnRyb2wgZmlsZXMgYW5kCiAgIGp1Z2dsZSB0aGVtIGF0 IGxpbmsgdGltZS4gICovCgppbnQgZmxhZ191c2VfcmVwb3NpdG9yeTsKCi8q IE5vbnplcm8gaWYgd2Ugd2FudCB0byBpc3N1ZSBkaWFnbm9zdGljcyB0aGF0 IHRoZSBzdGFuZGFyZCBzYXlzIGFyZSBub3QKICAgcmVxdWlyZWQuICAqLwoK aW50IGZsYWdfb3B0aW9uYWxfZGlhZ3MgPSAxOwoKLyogTm9uemVybyBtZWFu cyB3ZSBzaG91bGQgYXR0ZW1wdCB0byBlbGlkZSBjb25zdHJ1Y3RvcnMgd2hl biBwb3NzaWJsZS4gICovCgppbnQgZmxhZ19lbGlkZV9jb25zdHJ1Y3RvcnMg PSAxOwoKLyogTm9uemVybyBtZWFucyB0aGF0IG1lbWJlciBmdW5jdGlvbnMg ZGVmaW5lZCBpbiBjbGFzcyBzY29wZSBhcmUKICAgaW5saW5lIGJ5IGRlZmF1 bHQuICAqLwoKaW50IGZsYWdfZGVmYXVsdF9pbmxpbmUgPSAxOwoKLyogQ29u dHJvbHMgd2hldGhlciBjb21waWxlciBnZW5lcmF0ZXMgJ3R5cGUgZGVzY3Jp cHRvcicgdGhhdCBnaXZlCiAgIHJ1bi10aW1lIHR5cGUgaW5mb3JtYXRpb24u ICAqLwoKaW50IGZsYWdfcnR0aSA9IDE7CgovKiBOb256ZXJvIGlmIHdlIHdh bnQgdG8gY29uc2VydmUgc3BhY2UgaW4gdGhlIC5vIGZpbGVzLiAgV2UgZG8g dGhpcwogICBieSBwdXR0aW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSBhbmQgcnVu dGltZSBpbml0aWFsaXplZCBkYXRhIGludG8KICAgLmNvbW1vbiBpbnN0ZWFk IG9mIC5kYXRhIGF0IHRoZSBleHBlbnNlIG9mIG5vdCBmbGFnZ2luZyBtdWx0 aXBsZQogICBkZWZpbml0aW9ucy4gICovCgppbnQgZmxhZ19jb25zZXJ2ZV9z cGFjZTsKCi8qIE5vbnplcm8gaWYgd2Ugd2FudCB0byBvYmV5IGFjY2VzcyBj b250cm9sIHNlbWFudGljcy4gICovCgppbnQgZmxhZ19hY2Nlc3NfY29udHJv bCA9IDE7CgovKiBOb256ZXJvIGlmIHdlIHdhbnQgdG8gY2hlY2sgdGhlIHJl dHVybiB2YWx1ZSBvZiBuZXcgYW5kIGF2b2lkIGNhbGxpbmcKICAgY29uc3Ry dWN0b3JzIGlmIGl0IGlzIGEgbnVsbCBwb2ludGVyLiAgKi8KCmludCBmbGFn X2NoZWNrX25ldzsKCi8qIFRoZSBDKysgZGlhbGVjdCBiZWluZyB1c2VkLiBD Kys5OCBpcyB0aGUgZGVmYXVsdC4gICovCgplbnVtIGN4eF9kaWFsZWN0IGN4 eF9kaWFsZWN0ID0gY3h4OTg7CgovKiBOb256ZXJvIGlmIHdlIHdhbnQgdGhl IG5ldyBJU08gcnVsZXMgZm9yIHB1c2hpbmcgYSBuZXcgc2NvcGUgZm9yIGBm b3InCiAgIGluaXRpYWxpemF0aW9uIHZhcmlhYmxlcy4KICAgMDogT2xkIHJ1 bGVzLCBzZXQgYnkgLWZuby1mb3Itc2NvcGUuCiAgIDI6IE5ldyBJU08gcnVs ZXMsIHNldCBieSAtZmZvci1zY29wZS4KICAgMTogVHJ5IHRvIGltcGxlbWVu dCBuZXcgSVNPIHJ1bGVzLCBidXQgd2l0aCBiYWNrdXAgY29tcGF0aWJpbGl0 eQogICAoYW5kIHdhcm5pbmdzKS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGZv ciBub3cuICAqLwoKaW50IGZsYWdfbmV3X2Zvcl9zY29wZSA9IDE7CgovKiBO b256ZXJvIGlmIHdlIHdhbnQgdG8gZW1pdCBkZWZpbmVkIHN5bWJvbHMgd2l0 aCBjb21tb24tbGlrZSBsaW5rYWdlIGFzCiAgIHdlYWsgc3ltYm9scyB3aGVy ZSBwb3NzaWJsZSwgaW4gb3JkZXIgdG8gY29uZm9ybSB0byBDKysgc2VtYW50 aWNzLgogICBPdGhlcndpc2UsIGVtaXQgdGhlbSBhcyBsb2NhbCBzeW1ib2xz LiAgKi8KCmludCBmbGFnX3dlYWsgPSAxOwoKLyogMCBtZWFucyB3ZSB3YW50 IHRoZSBwcmVwcm9jZXNzb3IgdG8gbm90IGVtaXQgbGluZSBkaXJlY3RpdmVz IGZvcgogICB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIDEgbWVh bnMgd2Ugd2FudCBpdCB0byBkbyBpdC4gIC0xCiAgIG1lYW5zIHdlIHNob3Vs ZCBkZWNpZGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgZGVidWdnaW5nIGluZm9y bWF0aW9uCiAgIGlzIGJlaW5nIGVtaXR0ZWQgb3Igbm90LiAgKi8KCmludCBm bGFnX3dvcmtpbmdfZGlyZWN0b3J5ID0gLTE7CgovKiBOb256ZXJvIHRvIHVz ZSBfX2N4YV9hdGV4aXQsIHJhdGhlciB0aGFuIGF0ZXhpdCwgdG8gcmVnaXN0 ZXIKICAgZGVzdHJ1Y3RvcnMgZm9yIGxvY2FsIHN0YXRpY3MgYW5kIGdsb2Jh bCBvYmplY3RzLiAgJzInIG1lYW5zIGl0IGhhcyBiZWVuCiAgIHNldCBub256 ZXJvIGFzIGEgZGVmYXVsdCwgbm90IGJ5IGEgY29tbWFuZC1saW5lIGZsYWcu ICAqLwoKaW50IGZsYWdfdXNlX2N4YV9hdGV4aXQgPSBERUZBVUxUX1VTRV9D WEFfQVRFWElUOwoKLyogTm9uemVybyB0byB1c2UgX19jeGFfZ2V0X2V4Y2Vw dGlvbl9wdHIgaW4gQysrIGV4Y2VwdGlvbi1oYW5kbGluZwogICBjb2RlLiAg JzInIG1lYW5zIGl0IGhhcyBub3QgYmVlbiBzZXQgZXhwbGljaXRseSBvbiB0 aGUgY29tbWFuZCBsaW5lLiAgKi8KCmludCBmbGFnX3VzZV9jeGFfZ2V0X2V4 Y2VwdGlvbl9wdHIgPSAyOwoKLyogTm9uemVybyBtZWFucyBtYWtlIHRoZSBk ZWZhdWx0IHBlZHdhcm5zIHdhcm5pbmdzIGluc3RlYWQgb2YgZXJyb3JzLgog ICBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGlzIGlnbm9yZWQgaWYgLXBlZGFu dGljIGlzIHNwZWNpZmllZC4gICovCgppbnQgZmxhZ19wZXJtaXNzaXZlOwoK LyogTm9uemVybyBtZWFucyB0byBpbXBsZW1lbnQgc3RhbmRhcmQgc2VtYW50 aWNzIGZvciBleGNlcHRpb24KICAgc3BlY2lmaWNhdGlvbnMsIGNhbGxpbmcg dW5leHBlY3RlZCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIHRoYXQKICAg ZG9lc24ndCBtYXRjaCB0aGUgc3BlY2lmaWNhdGlvbi4gIFplcm8gbWVhbnMg dG8gdHJlYXQgdGhlbSBhcwogICBhc3NlcnRpb25zIGFuZCBvcHRpbWl6ZSBh Y2NvcmRpbmdseSwgYnV0IG5vdCBjaGVjayB0aGVtLiAgKi8KCmludCBmbGFn X2VuZm9yY2VfZWhfc3BlY3MgPSAxOwoKLyogTm9uemVybyBtZWFucyB0byBn ZW5lcmF0ZSB0aHJlYWQtc2FmZSBjb2RlIGZvciBpbml0aWFsaXppbmcgbG9j YWwKICAgc3RhdGljcy4gICovCgppbnQgZmxhZ190aHJlYWRzYWZlX3N0YXRp Y3MgPSAxOwoKLyogTm9uemVybyBtZWFucyB3YXJuIGFib3V0IGltcGxpY2l0 IGRlY2xhcmF0aW9ucy4gICovCgppbnQgd2Fybl9pbXBsaWNpdCA9IDE7Cgov KiBNYXhpbXVtIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGguICBUaGlz IGxpbWl0IGlzIHJhdGhlcgogICBhcmJpdHJhcnksIGJ1dCBpdCBleGlzdHMg dG8gbGltaXQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gbm90aWNlCiAgIGluZmlu aXRlIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLiAgKi8KCmludCBtYXhfdGlu c3RfZGVwdGggPSA1MDA7CgoKCi8qIFRoZSBlbGVtZW50cyBvZiBgcmlkcG9p bnRlcnMnIGFyZSBpZGVudGlmaWVyIG5vZGVzIGZvciB0aGUgcmVzZXJ2ZWQK ICAgdHlwZSBuYW1lcyBhbmQgc3RvcmFnZSBjbGFzc2VzLiAgSXQgaXMgaW5k ZXhlZCBieSBhIFJJRF8uLi4gdmFsdWUuICAqLwp0cmVlICpyaWRwb2ludGVy czsKCnRyZWUgKCptYWtlX2ZuYW1lX2RlY2wpICh0cmVlLCBpbnQpOwoKLyog Tm9uemVybyBtZWFucyB0aGUgZXhwcmVzc2lvbiBiZWluZyBwYXJzZWQgd2ls bCBuZXZlciBiZSBldmFsdWF0ZWQuCiAgIFRoaXMgaXMgYSBjb3VudCwgc2lu Y2UgdW5ldmFsdWF0ZWQgZXhwcmVzc2lvbnMgY2FuIG5lc3QuICAqLwppbnQg c2tpcF9ldmFsdWF0aW9uOwoKLyogSW5mb3JtYXRpb24gYWJvdXQgaG93IGEg ZnVuY3Rpb24gbmFtZSBpcyBnZW5lcmF0ZWQuICAqLwpzdHJ1Y3QgZm5hbWVf dmFyX3QKewogIHRyZWUgKmNvbnN0IGRlY2w7CS8qIHBvaW50ZXIgdG8gdGhl IFZBUl9ERUNMLiAgKi8KICBjb25zdCB1bnNpZ25lZCByaWQ7CS8qIFJJRCBu dW1iZXIgZm9yIHRoZSBpZGVudGlmaWVyLiAgKi8KICBjb25zdCBpbnQgcHJl dHR5OwkvKiBIb3cgcHJldHR5IGlzIGl0PyAqLwp9OwoKLyogVGhlIHRocmVl IHdheXMgb2YgZ2V0dGluZyB0aGVuIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnVu Y3Rpb24uICAqLwoKY29uc3Qgc3RydWN0IGZuYW1lX3Zhcl90IGZuYW1lX3Zh cnNbXSA9CnsKICAvKiBDOTkgY29tcGxpYW50IF9fZnVuY19fLCBtdXN0IGJl IGZpcnN0LiAgKi8KICB7JmM5OV9mdW5jdGlvbl9uYW1lX2RlY2xfbm9kZSwg UklEX0M5OV9GVU5DVElPTl9OQU1FLCAwfSwKICAvKiBHQ0MgX19GVU5DVElP Tl9fIGNvbXBsaWFudC4gICovCiAgeyZmdW5jdGlvbl9uYW1lX2RlY2xfbm9k ZSwgUklEX0ZVTkNUSU9OX05BTUUsIDB9LAogIC8qIEdDQyBfX1BSRVRUWV9G VU5DVElPTl9fIGNvbXBsaWFudC4gICovCiAgeyZwcmV0dHlfZnVuY3Rpb25f bmFtZV9kZWNsX25vZGUsIFJJRF9QUkVUVFlfRlVOQ1RJT05fTkFNRSwgMX0s CiAge05VTEwsIDAsIDB9LAp9OwoKc3RhdGljIHRyZWUgY2hlY2tfY2FzZV92 YWx1ZSAodHJlZSk7CnN0YXRpYyBib29sIGNoZWNrX2Nhc2VfYm91bmRzICh0 cmVlLCB0cmVlLCB0cmVlICosIHRyZWUgKik7CgpzdGF0aWMgdHJlZSBoYW5k bGVfcGFja2VkX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQs IGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub2NvbW1vbl9hdHRyaWJ1 dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMg dHJlZSBoYW5kbGVfY29tbW9uX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0 cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub3JldHVy bl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICop OwpzdGF0aWMgdHJlZSBoYW5kbGVfaG90X2F0dHJpYnV0ZSAodHJlZSAqLCB0 cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9j b2xkX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wg Kik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub2lubGluZV9hdHRyaWJ1dGUgKHRy ZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBo YW5kbGVfYWx3YXlzX2lubGluZV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwg dHJlZSwgaW50LAoJCQkJCSAgICBib29sICopOwpzdGF0aWMgdHJlZSBoYW5k bGVfZ251X2lubGluZV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwg aW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfYXJ0aWZpY2lhbF9h dHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpz dGF0aWMgdHJlZSBoYW5kbGVfZmxhdHRlbl9hdHRyaWJ1dGUgKHRyZWUgKiwg dHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVf ZXJyb3JfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9v bCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX3VzZWRfYXR0cmlidXRlICh0cmVl ICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFu ZGxlX3VudXNlZF9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50 LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfZXh0ZXJuYWxseV92aXNp YmxlX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsCgkJCQkJ CSBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfY29uc3RfYXR0cmlidXRl ICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRy ZWUgaGFuZGxlX3RyYW5zcGFyZW50X3VuaW9uX2F0dHJpYnV0ZSAodHJlZSAq LCB0cmVlLCB0cmVlLAoJCQkJCQlpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVl IGhhbmRsZV9jb25zdHJ1Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwg dHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfZGVzdHJ1 Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29s ICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfbW9kZV9hdHRyaWJ1dGUgKHRyZWUg KiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5k bGVfc2VjdGlvbl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50 LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfYWxpZ25lZF9hdHRyaWJ1 dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMg dHJlZSBoYW5kbGVfd2Vha19hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJl ZSwgaW50LCBib29sICopIDsKc3RhdGljIHRyZWUgaGFuZGxlX2FsaWFzX2F0 dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0 YXRpYyB0cmVlIGhhbmRsZV93ZWFrcmVmX2F0dHJpYnV0ZSAodHJlZSAqLCB0 cmVlLCB0cmVlLCBpbnQsIGJvb2wgKikgOwpzdGF0aWMgdHJlZSBoYW5kbGVf dmlzaWJpbGl0eV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50 LAoJCQkJCSBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfdGxzX21vZGVs X2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsCgkJCQkJYm9v bCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX25vX2luc3RydW1lbnRfZnVuY3Rp b25fYXR0cmlidXRlICh0cmVlICosIHRyZWUsCgkJCQkJCSAgICAgdHJlZSwg aW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfbWFsbG9jX2F0dHJp YnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRp YyB0cmVlIGhhbmRsZV9yZXR1cm5zX3R3aWNlX2F0dHJpYnV0ZSAodHJlZSAq LCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRs ZV9ub19saW1pdF9zdGFja19hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJl ZSwgaW50LAoJCQkJCSAgICAgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxl X3B1cmVfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9v bCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX25vdm9wc19hdHRyaWJ1dGUgKHRy ZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBo YW5kbGVfZGVwcmVjYXRlZF9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJl ZSwgaW50LAoJCQkJCSBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfdmVj dG9yX3NpemVfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwK CQkJCQkgIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9ub25udWxsX2F0 dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0 YXRpYyB0cmVlIGhhbmRsZV9ub3Rocm93X2F0dHJpYnV0ZSAodHJlZSAqLCB0 cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9j bGVhbnVwX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJv b2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV93YXJuX3VudXNlZF9yZXN1bHRf YXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwKCQkJCQkJIGJv b2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9zZW50aW5lbF9hdHRyaWJ1dGUg KHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJl ZSBoYW5kbGVfdHlwZV9nZW5lcmljX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVl LCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9hbGxv Y19zaXplX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJv b2wgKik7CgpzdGF0aWMgdm9pZCBjaGVja19mdW5jdGlvbl9ub25udWxsICh0 cmVlLCBpbnQsIHRyZWUgKik7CnN0YXRpYyB2b2lkIGNoZWNrX25vbm51bGxf YXJnICh2b2lkICosIHRyZWUsIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpOwpz dGF0aWMgYm9vbCBub25udWxsX2NoZWNrX3AgKHRyZWUsIHVuc2lnbmVkIEhP U1RfV0lERV9JTlQpOwpzdGF0aWMgYm9vbCBnZXRfbm9ubnVsbF9vcGVyYW5k ICh0cmVlLCB1bnNpZ25lZCBIT1NUX1dJREVfSU5UICopOwpzdGF0aWMgaW50 IHJlc29ydF9maWVsZF9kZWNsX2NtcCAoY29uc3Qgdm9pZCAqLCBjb25zdCB2 b2lkICopOwoKLyogVGFibGUgb2YgbWFjaGluZS1pbmRlcGVuZGVudCBhdHRy aWJ1dGVzIGNvbW1vbiB0byBhbGwgQy1saWtlIGxhbmd1YWdlcy4gICovCmNv bnN0IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYyBjX2NvbW1vbl9hdHRyaWJ1dGVf dGFibGVbXSA9CnsKICAvKiB7IG5hbWUsIG1pbl9sZW4sIG1heF9sZW4sIGRl Y2xfcmVxLCB0eXBlX3JlcSwgZm5fdHlwZV9yZXEsIGhhbmRsZXIgfSAqLwog IHsgInBhY2tlZCIsICAgICAgICAgICAgICAgICAwLCAwLCBmYWxzZSwgZmFs c2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfcGFja2VkX2F0dHJpYnV0ZSB9 LAogIHsgIm5vY29tbW9uIiwgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAg ZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfbm9jb21tb25fYXR0cmli dXRlIH0sCiAgeyAiY29tbW9uIiwgICAgICAgICAgICAgICAgIDAsIDAsIHRy dWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9jb21tb25fYXR0 cmlidXRlIH0sCiAgLyogRklYTUU6IGxvZ2ljYWxseSwgbm9yZXR1cm4gYXR0 cmlidXRlcyBzaG91bGQgYmUgbGlzdGVkIGFzCiAgICAgImZhbHNlLCB0cnVl LCB0cnVlIiBhbmQgYXBwbHkgdG8gZnVuY3Rpb24gdHlwZXMuICBCdXQgaW1w bGVtZW50aW5nIHRoaXMKICAgICB3b3VsZCByZXF1aXJlIGFsbCB0aGUgcGxh Y2VzIGluIHRoZSBjb21waWxlciB0aGF0IHVzZSBUUkVFX1RISVNfVk9MQVRJ TEUKICAgICBvbiBhIGRlY2wgdG8gaWRlbnRpZnkgbm9uLXJldHVybmluZyBm dW5jdGlvbnMgdG8gYmUgbG9jYXRlZCBhbmQgZml4ZWQKICAgICB0byBjaGVj ayB0aGUgZnVuY3Rpb24gdHlwZSBpbnN0ZWFkLiAgKi8KICB7ICJub3JldHVy biIsICAgICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwK CQkJICAgICAgaGFuZGxlX25vcmV0dXJuX2F0dHJpYnV0ZSB9LAogIHsgInZv bGF0aWxlIiwgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZh bHNlLAoJCQkgICAgICBoYW5kbGVfbm9yZXR1cm5fYXR0cmlidXRlIH0sCiAg eyAibm9pbmxpbmUiLCAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxz ZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9ub2lubGluZV9hdHRyaWJ1dGUg fSwKICB7ICJhbHdheXNfaW5saW5lIiwgICAgICAgICAgMCwgMCwgdHJ1ZSwg IGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX2Fsd2F5c19pbmxpbmVf YXR0cmlidXRlIH0sCiAgeyAiZ251X2lubGluZSIsICAgICAgICAgICAgIDAs IDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9nbnVf aW5saW5lX2F0dHJpYnV0ZSB9LAogIHsgImFydGlmaWNpYWwiLCAgICAgICAg ICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5k bGVfYXJ0aWZpY2lhbF9hdHRyaWJ1dGUgfSwKICB7ICJmbGF0dGVuIiwgICAg ICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAg ICAgaGFuZGxlX2ZsYXR0ZW5fYXR0cmlidXRlIH0sCiAgeyAidXNlZCIsICAg ICAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJ CSAgICAgIGhhbmRsZV91c2VkX2F0dHJpYnV0ZSB9LAogIHsgInVudXNlZCIs ICAgICAgICAgICAgICAgICAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAoJ CQkgICAgICBoYW5kbGVfdW51c2VkX2F0dHJpYnV0ZSB9LAogIHsgImV4dGVy bmFsbHlfdmlzaWJsZSIsICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNl LAoJCQkgICAgICBoYW5kbGVfZXh0ZXJuYWxseV92aXNpYmxlX2F0dHJpYnV0 ZSB9LAogIC8qIFRoZSBzYW1lIGNvbW1lbnRzIGFzIGZvciBub3JldHVybiBh dHRyaWJ1dGVzIGFwcGx5IHRvIGNvbnN0IG9uZXMuICAqLwogIHsgImNvbnN0 IiwgICAgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNl LAoJCQkgICAgICBoYW5kbGVfY29uc3RfYXR0cmlidXRlIH0sCiAgeyAidHJh bnNwYXJlbnRfdW5pb24iLCAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFs c2UsCgkJCSAgICAgIGhhbmRsZV90cmFuc3BhcmVudF91bmlvbl9hdHRyaWJ1 dGUgfSwKICB7ICJjb25zdHJ1Y3RvciIsICAgICAgICAgICAgMCwgMSwgdHJ1 ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX2NvbnN0cnVjdG9y X2F0dHJpYnV0ZSB9LAogIHsgImRlc3RydWN0b3IiLCAgICAgICAgICAgICAw LCAxLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfZGVz dHJ1Y3Rvcl9hdHRyaWJ1dGUgfSwKICB7ICJtb2RlIiwgICAgICAgICAgICAg ICAgICAgMSwgMSwgZmFsc2UsICB0cnVlLCBmYWxzZSwKCQkJICAgICAgaGFu ZGxlX21vZGVfYXR0cmlidXRlIH0sCiAgeyAic2VjdGlvbiIsICAgICAgICAg ICAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhh bmRsZV9zZWN0aW9uX2F0dHJpYnV0ZSB9LAogIHsgImFsaWduZWQiLCAgICAg ICAgICAgICAgICAwLCAxLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAoJCQkgICAg ICBoYW5kbGVfYWxpZ25lZF9hdHRyaWJ1dGUgfSwKICB7ICJ3ZWFrIiwgICAg ICAgICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJ ICAgICAgaGFuZGxlX3dlYWtfYXR0cmlidXRlIH0sCiAgeyAiYWxpYXMiLCAg ICAgICAgICAgICAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJ CSAgICAgIGhhbmRsZV9hbGlhc19hdHRyaWJ1dGUgfSwKICB7ICJ3ZWFrcmVm IiwgICAgICAgICAgICAgICAgMCwgMSwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwK CQkJICAgICAgaGFuZGxlX3dlYWtyZWZfYXR0cmlidXRlIH0sCiAgeyAibm9f aW5zdHJ1bWVudF9mdW5jdGlvbiIsIDAsIDAsIHRydWUsICBmYWxzZSwgZmFs c2UsCgkJCSAgICAgIGhhbmRsZV9ub19pbnN0cnVtZW50X2Z1bmN0aW9uX2F0 dHJpYnV0ZSB9LAogIHsgIm1hbGxvYyIsICAgICAgICAgICAgICAgICAwLCAw LCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfbWFsbG9j X2F0dHJpYnV0ZSB9LAogIHsgInJldHVybnNfdHdpY2UiLCAgICAgICAgICAw LCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfcmV0 dXJuc190d2ljZV9hdHRyaWJ1dGUgfSwKICB7ICJub19zdGFja19saW1pdCIs ICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAg aGFuZGxlX25vX2xpbWl0X3N0YWNrX2F0dHJpYnV0ZSB9LAogIHsgInB1cmUi LCAgICAgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNl LAoJCQkgICAgICBoYW5kbGVfcHVyZV9hdHRyaWJ1dGUgfSwKICAvKiBGb3Ig aW50ZXJuYWwgdXNlIChtYXJraW5nIG9mIGJ1aWx0aW5zKSBvbmx5LiAgVGhl IG5hbWUgY29udGFpbnMgc3BhY2UKICAgICB0byBwcmV2ZW50IGl0cyB1c2Fn ZSBpbiBzb3VyY2UgY29kZS4gICovCiAgeyAibm8gdm9wcyIsICAgICAgICAg ICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhh bmRsZV9ub3ZvcHNfYXR0cmlidXRlIH0sCiAgeyAiZGVwcmVjYXRlZCIsICAg ICAgICAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCgkJCSAgICAg IGhhbmRsZV9kZXByZWNhdGVkX2F0dHJpYnV0ZSB9LAogIHsgInZlY3Rvcl9z aXplIiwJICAgICAgMSwgMSwgZmFsc2UsIHRydWUsIGZhbHNlLAoJCQkgICAg ICBoYW5kbGVfdmVjdG9yX3NpemVfYXR0cmlidXRlIH0sCiAgeyAidmlzaWJp bGl0eSIsCSAgICAgIDEsIDEsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCgkJCSAg ICAgIGhhbmRsZV92aXNpYmlsaXR5X2F0dHJpYnV0ZSB9LAogIHsgInRsc19t b2RlbCIsCSAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAg ICAgIGhhbmRsZV90bHNfbW9kZWxfYXR0cmlidXRlIH0sCiAgeyAibm9ubnVs bCIsICAgICAgICAgICAgICAgIDAsIC0xLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwK CQkJICAgICAgaGFuZGxlX25vbm51bGxfYXR0cmlidXRlIH0sCiAgeyAibm90 aHJvdyIsICAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFs c2UsCgkJCSAgICAgIGhhbmRsZV9ub3Rocm93X2F0dHJpYnV0ZSB9LAogIHsg Im1heV9hbGlhcyIsCSAgICAgIDAsIDAsIGZhbHNlLCB0cnVlLCBmYWxzZSwg TlVMTCB9LAogIHsgImNsZWFudXAiLAkJICAgICAgMSwgMSwgdHJ1ZSwgZmFs c2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfY2xlYW51cF9hdHRyaWJ1dGUg fSwKICB7ICJ3YXJuX3VudXNlZF9yZXN1bHQiLCAgICAgMCwgMCwgZmFsc2Us IHRydWUsIHRydWUsCgkJCSAgICAgIGhhbmRsZV93YXJuX3VudXNlZF9yZXN1 bHRfYXR0cmlidXRlIH0sCiAgeyAic2VudGluZWwiLCAgICAgICAgICAgICAg IDAsIDEsIGZhbHNlLCB0cnVlLCB0cnVlLAoJCQkgICAgICBoYW5kbGVfc2Vu dGluZWxfYXR0cmlidXRlIH0sCiAgLyogRm9yIGludGVybmFsIHVzZSAobWFy a2luZyBvZiBidWlsdGlucykgb25seS4gIFRoZSBuYW1lIGNvbnRhaW5zIHNw YWNlCiAgICAgdG8gcHJldmVudCBpdHMgdXNhZ2UgaW4gc291cmNlIGNvZGUu ICAqLwogIHsgInR5cGUgZ2VuZXJpYyIsICAgICAgICAgICAwLCAwLCBmYWxz ZSwgdHJ1ZSwgdHJ1ZSwKCQkJICAgICAgaGFuZGxlX3R5cGVfZ2VuZXJpY19h dHRyaWJ1dGUgfSwKICB7ICJhbGxvY19zaXplIiwJICAgICAgMSwgMiwgZmFs c2UsIHRydWUsIHRydWUsCgkJCSAgICAgIGhhbmRsZV9hbGxvY19zaXplX2F0 dHJpYnV0ZSB9LAogIHsgImNvbGQiLCAgICAgICAgICAgICAgICAgICAwLCAw LCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfY29sZF9h dHRyaWJ1dGUgfSwKICB7ICJob3QiLCAgICAgICAgICAgICAgICAgICAgMCwg MCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX2hvdF9h dHRyaWJ1dGUgfSwKICB7ICJ3YXJuaW5nIiwJCSAgICAgIDEsIDEsIHRydWUs ICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9lcnJvcl9hdHRyaWJ1 dGUgfSwKICB7ICJlcnJvciIsCQkgICAgICAxLCAxLCB0cnVlLCAgZmFsc2Us IGZhbHNlLAoJCQkgICAgICBoYW5kbGVfZXJyb3JfYXR0cmlidXRlIH0sCiAg eyBOVUxMLCAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGZhbHNlLCBmYWxz ZSwgZmFsc2UsIE5VTEwgfQp9OwoKLyogR2l2ZSB0aGUgc3BlY2lmaWNhdGlv bnMgZm9yIHRoZSBmb3JtYXQgYXR0cmlidXRlcywgdXNlZCBieSBDIGFuZCBh bGwKICAgZGVzY2VuZGFudHMuICAqLwoKY29uc3Qgc3RydWN0IGF0dHJpYnV0 ZV9zcGVjIGNfY29tbW9uX2Zvcm1hdF9hdHRyaWJ1dGVfdGFibGVbXSA9CnsK ICAvKiB7IG5hbWUsIG1pbl9sZW4sIG1heF9sZW4sIGRlY2xfcmVxLCB0eXBl X3JlcSwgZm5fdHlwZV9yZXEsIGhhbmRsZXIgfSAqLwogIHsgImZvcm1hdCIs ICAgICAgICAgICAgICAgICAzLCAzLCBmYWxzZSwgdHJ1ZSwgIHRydWUsCgkJ CSAgICAgIGhhbmRsZV9mb3JtYXRfYXR0cmlidXRlIH0sCiAgeyAiZm9ybWF0 X2FyZyIsICAgICAgICAgICAgIDEsIDEsIGZhbHNlLCB0cnVlLCAgdHJ1ZSwK CQkJICAgICAgaGFuZGxlX2Zvcm1hdF9hcmdfYXR0cmlidXRlIH0sCiAgeyBO VUxMLCAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwg ZmFsc2UsIE5VTEwgfQp9OwoKLyogUHVzaCBjdXJyZW50IGJpbmRpbmdzIGZv ciB0aGUgZnVuY3Rpb24gbmFtZSBWQVJfREVDTFMuICAqLwoKdm9pZApzdGFy dF9mbmFtZV9kZWNscyAodm9pZCkKewogIHVuc2lnbmVkIGl4OwogIHRyZWUg c2F2ZWQgPSBOVUxMX1RSRUU7CgogIGZvciAoaXggPSAwOyBmbmFtZV92YXJz W2l4XS5kZWNsOyBpeCsrKQogICAgewogICAgICB0cmVlIGRlY2wgPSAqZm5h bWVfdmFyc1tpeF0uZGVjbDsKCiAgICAgIGlmIChkZWNsKQoJewoJICBzYXZl ZCA9IHRyZWVfY29ucyAoZGVjbCwgYnVpbGRfaW50X2NzdCAoTlVMTF9UUkVF LCBpeCksIHNhdmVkKTsKCSAgKmZuYW1lX3ZhcnNbaXhdLmRlY2wgPSBOVUxM X1RSRUU7Cgl9CiAgICB9CiAgaWYgKHNhdmVkIHx8IHNhdmVkX2Z1bmN0aW9u X25hbWVfZGVjbHMpCiAgICAvKiBOb3JtYWxseSB0aGV5J2xsIGhhdmUgYmVl biBOVUxMLCBzbyBvbmx5IHB1c2ggaWYgd2UndmUgZ290IGEKICAgICAgIHN0 YWNrLCBvciB0aGV5IGFyZSBub24tTlVMTC4gICovCiAgICBzYXZlZF9mdW5j dGlvbl9uYW1lX2RlY2xzID0gdHJlZV9jb25zIChzYXZlZCwgTlVMTF9UUkVF LAoJCQkJCSAgIHNhdmVkX2Z1bmN0aW9uX25hbWVfZGVjbHMpOwp9CgovKiBG aW5pc2ggdXAgdGhlIGN1cnJlbnQgYmluZGluZ3MsIGFkZGluZyB0aGVtIGlu dG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24ncwogICBzdGF0ZW1lbnQgdHJlZS4g IFRoaXMgbXVzdCBiZSBkb25lIF9iZWZvcmVfIGZpbmlzaF9zdG10X3RyZWUg aXMgY2FsbGVkLgogICBJZiB0aGVyZSBpcyBubyBjdXJyZW50IGZ1bmN0aW9u LCB3ZSBtdXN0IGJlIGF0IGZpbGUgc2NvcGUgYW5kIG5vIHN0YXRlbWVudHMK ICAgYXJlIGludm9sdmVkLiBQb3AgdGhlIHByZXZpb3VzIGJpbmRpbmdzLiAg Ki8KCnZvaWQKZmluaXNoX2ZuYW1lX2RlY2xzICh2b2lkKQp7CiAgdW5zaWdu ZWQgaXg7CiAgdHJlZSBzdG10cyA9IE5VTExfVFJFRTsKICB0cmVlIHN0YWNr ID0gc2F2ZWRfZnVuY3Rpb25fbmFtZV9kZWNsczsKCiAgZm9yICg7IHN0YWNr ICYmIFRSRUVfVkFMVUUgKHN0YWNrKTsgc3RhY2sgPSBUUkVFX0NIQUlOIChz dGFjaykpCiAgICBhcHBlbmRfdG9fc3RhdGVtZW50X2xpc3QgKFRSRUVfVkFM VUUgKHN0YWNrKSwgJnN0bXRzKTsKCiAgaWYgKHN0bXRzKQogICAgewogICAg ICB0cmVlICpib2R5cCA9ICZERUNMX1NBVkVEX1RSRUUgKGN1cnJlbnRfZnVu Y3Rpb25fZGVjbCk7CgogICAgICBpZiAoVFJFRV9DT0RFICgqYm9keXApID09 IEJJTkRfRVhQUikKCWJvZHlwID0gJkJJTkRfRVhQUl9CT0RZICgqYm9keXAp OwoKICAgICAgYXBwZW5kX3RvX3N0YXRlbWVudF9saXN0X2ZvcmNlICgqYm9k eXAsICZzdG10cyk7CiAgICAgICpib2R5cCA9IHN0bXRzOwogICAgfQoKICBm b3IgKGl4ID0gMDsgZm5hbWVfdmFyc1tpeF0uZGVjbDsgaXgrKykKICAgICpm bmFtZV92YXJzW2l4XS5kZWNsID0gTlVMTF9UUkVFOwoKICBpZiAoc3RhY2sp CiAgICB7CiAgICAgIC8qIFdlIGhhZCBzYXZlZCB2YWx1ZXMsIHJlc3RvcmUg dGhlbS4gICovCiAgICAgIHRyZWUgc2F2ZWQ7CgogICAgICBmb3IgKHNhdmVk ID0gVFJFRV9QVVJQT1NFIChzdGFjayk7IHNhdmVkOyBzYXZlZCA9IFRSRUVf Q0hBSU4gKHNhdmVkKSkKCXsKCSAgdHJlZSBkZWNsID0gVFJFRV9QVVJQT1NF IChzYXZlZCk7CgkgIHVuc2lnbmVkIGl4ID0gVFJFRV9JTlRfQ1NUX0xPVyAo VFJFRV9WQUxVRSAoc2F2ZWQpKTsKCgkgICpmbmFtZV92YXJzW2l4XS5kZWNs ID0gZGVjbDsKCX0KICAgICAgc3RhY2sgPSBUUkVFX0NIQUlOIChzdGFjayk7 CiAgICB9CiAgc2F2ZWRfZnVuY3Rpb25fbmFtZV9kZWNscyA9IHN0YWNrOwp9 CgovKiBSZXR1cm4gdGhlIHRleHQgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5j dGlvbiwgc3VpdGFibHkgcHJldHRpZmllZAogICBieSBQUkVUVFlfUC4gIFJl dHVybiBzdHJpbmcgbXVzdCBiZSBmcmVlZCBieSBjYWxsZXIuICAqLwoKY29u c3QgY2hhciAqCmZuYW1lX2FzX3N0cmluZyAoaW50IHByZXR0eV9wKQp7CiAg Y29uc3QgY2hhciAqbmFtZSA9ICJ0b3AgbGV2ZWwiOwogIGNoYXIgKm5hbWVw OwogIGludCB2cmIgPSAyLCBsZW47CiAgY3BwX3N0cmluZyBjc3RyID0geyAw LCAwIH0sIHN0cm5hbWU7CgogIGlmICghcHJldHR5X3ApCiAgICB7CiAgICAg IG5hbWUgPSAiIjsKICAgICAgdnJiID0gMDsKICAgIH0KCiAgaWYgKGN1cnJl bnRfZnVuY3Rpb25fZGVjbCkKICAgIG5hbWUgPSBsYW5nX2hvb2tzLmRlY2xf cHJpbnRhYmxlX25hbWUgKGN1cnJlbnRfZnVuY3Rpb25fZGVjbCwgdnJiKTsK CiAgbGVuID0gc3RybGVuIChuYW1lKSArIDM7IC8qIFR3byBmb3IgJyIncy4g IE9uZSBmb3IgTlVMTC4gICovCgogIG5hbWVwID0gWE5FV1ZFQyAoY2hhciwg bGVuKTsKICBzbnByaW50ZiAobmFtZXAsIGxlbiwgIlwiJXNcIiIsIG5hbWUp OwogIHN0cm5hbWUudGV4dCA9ICh1bnNpZ25lZCBjaGFyICopIG5hbWVwOwog IHN0cm5hbWUubGVuID0gbGVuIC0gMTsKCiAgaWYgKGNwcF9pbnRlcnByZXRf c3RyaW5nIChwYXJzZV9pbiwgJnN0cm5hbWUsIDEsICZjc3RyLCBmYWxzZSkp CiAgICB7CiAgICAgIFhERUxFVEVWRUMgKG5hbWVwKTsKICAgICAgcmV0dXJu IChjb25zdCBjaGFyICopIGNzdHIudGV4dDsKICAgIH0KCiAgcmV0dXJuIG5h bWVwOwp9CgovKiBFeHBhbmQgREVDTCBpZiBpdCBkZWNsYXJlcyBhbiBlbnRp dHkgbm90IGhhbmRsZWQgYnkgdGhlCiAgIGNvbW1vbiBjb2RlLiAgKi8KCmlu dApjX2V4cGFuZF9kZWNsICh0cmVlIGRlY2wpCnsKICBpZiAoVFJFRV9DT0RF IChkZWNsKSA9PSBWQVJfREVDTCAmJiAhVFJFRV9TVEFUSUMgKGRlY2wpKQog ICAgewogICAgICAvKiBMZXQgdGhlIGJhY2stZW5kIGtub3cgYWJvdXQgdGhp cyB2YXJpYWJsZS4gICovCiAgICAgIGlmICghYW5vbl9hZ2dyX3R5cGVfcCAo VFJFRV9UWVBFIChkZWNsKSkpCgllbWl0X2xvY2FsX3ZhciAoZGVjbCk7CiAg ICAgIGVsc2UKCWV4cGFuZF9hbm9uX3VuaW9uX2RlY2wgKGRlY2wsIE5VTExf VFJFRSwKCQkJCURFQ0xfQU5PTl9VTklPTl9FTEVNUyAoZGVjbCkpOwogICAg fQogIGVsc2UKICAgIHJldHVybiAwOwoKICByZXR1cm4gMTsKfQoKCi8qIFJl dHVybiB0aGUgVkFSX0RFQ0wgZm9yIGEgY29uc3QgY2hhciBhcnJheSBuYW1p bmcgdGhlIGN1cnJlbnQKICAgZnVuY3Rpb24uIElmIHRoZSBWQVJfREVDTCBo YXMgbm90IHlldCBiZWVuIGNyZWF0ZWQsIGNyZWF0ZSBpdAogICBub3cuIFJJ RCBpbmRpY2F0ZXMgaG93IGl0IHNob3VsZCBiZSBmb3JtYXR0ZWQgYW5kIElE RU5USUZJRVJfTk9ERQogICBJRCBpcyBpdHMgbmFtZSAodW5mb3J0dW5hdGVs eSBDIGFuZCBDKysgaG9sZCB0aGUgUklEIHZhbHVlcyBvZgogICBrZXl3b3Jk cyBpbiBkaWZmZXJlbnQgcGxhY2VzLCBzbyB3ZSBjYW4ndCBkZXJpdmUgUklE IGZyb20gSUQgaW4KICAgdGhpcyBsYW5ndWFnZSBpbmRlcGVuZGVudCBjb2Rl LiAgKi8KCnRyZWUKZm5hbWVfZGVjbCAodW5zaWduZWQgaW50IHJpZCwgdHJl ZSBpZCkKewogIHVuc2lnbmVkIGl4OwogIHRyZWUgZGVjbCA9IE5VTExfVFJF RTsKCiAgZm9yIChpeCA9IDA7IGZuYW1lX3ZhcnNbaXhdLmRlY2w7IGl4Kysp CiAgICBpZiAoZm5hbWVfdmFyc1tpeF0ucmlkID09IHJpZCkKICAgICAgYnJl YWs7CgogIGRlY2wgPSAqZm5hbWVfdmFyc1tpeF0uZGVjbDsKICBpZiAoIWRl Y2wpCiAgICB7CiAgICAgIC8qIElmIGEgdHJlZSBpcyBidWlsdCBoZXJlLCBp dCB3b3VsZCBub3JtYWxseSBoYXZlIHRoZSBsaW5lbm8gb2YKCSB0aGUgY3Vy cmVudCBzdGF0ZW1lbnQuICBMYXRlciB0aGlzIHRyZWUgd2lsbCBiZSBtb3Zl ZCB0byB0aGUKCSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGlz IGxpbmUgbnVtYmVyIHdpbGwgYmUgd3JvbmcuCgkgVG8gYXZvaWQgdGhpcyBw cm9ibGVtIHNldCB0aGUgbGluZW5vIHRvIDAgaGVyZTsgdGhhdCBwcmV2ZW50 cwoJIGl0IGZyb20gYXBwZWFyaW5nIGluIHRoZSBSVEwuICAqLwogICAgICB0 cmVlIHN0bXRzOwogICAgICBsb2NhdGlvbl90IHNhdmVkX2xvY2F0aW9uID0g aW5wdXRfbG9jYXRpb247CiNpZmRlZiBVU0VfTUFQUEVEX0xPQ0FUSU9OCiAg ICAgIGlucHV0X2xvY2F0aW9uID0gVU5LTk9XTl9MT0NBVElPTjsKI2Vsc2UK ICAgICAgaW5wdXRfbGluZSA9IDA7CiNlbmRpZgoKICAgICAgc3RtdHMgPSBw dXNoX3N0bXRfbGlzdCAoKTsKICAgICAgZGVjbCA9ICgqbWFrZV9mbmFtZV9k ZWNsKSAoaWQsIGZuYW1lX3ZhcnNbaXhdLnByZXR0eSk7CiAgICAgIHN0bXRz ID0gcG9wX3N0bXRfbGlzdCAoc3RtdHMpOwogICAgICBpZiAoIUlTX0VNUFRZ X1NUTVQgKHN0bXRzKSkKCXNhdmVkX2Z1bmN0aW9uX25hbWVfZGVjbHMKCSAg PSB0cmVlX2NvbnMgKGRlY2wsIHN0bXRzLCBzYXZlZF9mdW5jdGlvbl9uYW1l X2RlY2xzKTsKICAgICAgKmZuYW1lX3ZhcnNbaXhdLmRlY2wgPSBkZWNsOwog ICAgICBpbnB1dF9sb2NhdGlvbiA9IHNhdmVkX2xvY2F0aW9uOwogICAgfQog IGlmICghaXggJiYgIWN1cnJlbnRfZnVuY3Rpb25fZGVjbCkKICAgIHBlZHdh cm4gKCIlcUQgaXMgbm90IGRlZmluZWQgb3V0c2lkZSBvZiBmdW5jdGlvbiBz Y29wZSIsIGRlY2wpOwoKICByZXR1cm4gZGVjbDsKfQoKLyogR2l2ZW4gYSBT VFJJTkdfQ1NULCBnaXZlIGl0IGEgc3VpdGFibGUgYXJyYXktb2YtY2hhcnMg ZGF0YSB0eXBlLiAgKi8KCnRyZWUKZml4X3N0cmluZ190eXBlICh0cmVlIHZh bHVlKQp7CiAgY29uc3QgaW50IHdjaGFyX2J5dGVzID0gVFlQRV9QUkVDSVNJ T04gKHdjaGFyX3R5cGVfbm9kZSkgLyBCSVRTX1BFUl9VTklUOwogIGNvbnN0 IGludCB3aWRlX2ZsYWcgPSBUUkVFX1RZUEUgKHZhbHVlKSA9PSB3Y2hhcl9h cnJheV90eXBlX25vZGU7CiAgaW50IGxlbmd0aCA9IFRSRUVfU1RSSU5HX0xF TkdUSCAodmFsdWUpOwogIGludCBuY2hhcnM7CiAgdHJlZSBlX3R5cGUsIGlf dHlwZSwgYV90eXBlOwoKICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZWxl bWVudHMsIGZvciB0aGUgYXJyYXkgdHlwZS4gICovCiAgbmNoYXJzID0gd2lk ZV9mbGFnID8gbGVuZ3RoIC8gd2NoYXJfYnl0ZXMgOiBsZW5ndGg7CgogIC8q IEM4OSAyLjIuNC4xLCBDOTkgNS4yLjQuMSAoVHJhbnNsYXRpb24gbGltaXRz KS4gIFRoZSBhbmFsb2dvdXMKICAgICBsaW1pdCBpbiBDKys5OCBBbm5leCBC IGlzIHZlcnkgbGFyZ2UgKDY1NTM2KSBhbmQgaXMgbm90IG5vcm1hdGl2ZSwK ICAgICBzbyB3ZSBkbyBub3QgZGlhZ25vc2UgaXQgKHdhcm5fb3Zlcmxlbmd0 aF9zdHJpbmdzIGlzIGZvcmNlZCBvZmYKICAgICBpbiBjX2NvbW1vbl9wb3N0 X29wdGlvbnMpLiAgKi8KICBpZiAod2Fybl9vdmVybGVuZ3RoX3N0cmluZ3Mp CiAgICB7CiAgICAgIGNvbnN0IGludCBuY2hhcnNfbWF4ID0gZmxhZ19pc29j OTkgPyA0MDk1IDogNTA5OwogICAgICBjb25zdCBpbnQgcmVsZXZhbnRfc3Rk ID0gZmxhZ19pc29jOTkgPyA5OSA6IDkwOwogICAgICBpZiAobmNoYXJzIC0g MSA+IG5jaGFyc19tYXgpCgkvKiBUcmFuc2xhdG9yczogVGhlICVkIGFmdGVy ICdJU08gQycgd2lsbCBiZSA5MCBvciA5OS4gIERvIG5vdAoJICAgc2VwYXJh dGUgdGhlICVkIGZyb20gdGhlICdDJy4gICdJU08nIHNob3VsZCBub3QgYmUK CSAgIHRyYW5zbGF0ZWQsIGJ1dCBpdCBtYXkgYmUgbW92ZWQgYWZ0ZXIgJ0Ml ZCcgaW4gbGFuZ3VhZ2VzCgkgICB3aGVyZSBtb2RpZmllcnMgZm9sbG93IG5v dW5zLiAgKi8KCXBlZHdhcm4gKCJzdHJpbmcgbGVuZ3RoICVxZCBpcyBncmVh dGVyIHRoYW4gdGhlIGxlbmd0aCAlcWQgIgoJCSAiSVNPIEMlZCBjb21waWxl cnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQiLAoJCSBuY2hhcnMgLSAxLCBu Y2hhcnNfbWF4LCByZWxldmFudF9zdGQpOwogICAgfQoKICAvKiBDcmVhdGUg dGhlIGFycmF5IHR5cGUgZm9yIHRoZSBzdHJpbmcgY29uc3RhbnQuICBUaGUg SVNPIEMrKwogICAgIHN0YW5kYXJkIHNheXMgdGhhdCBhIHN0cmluZyBsaXRl cmFsIGhhcyB0eXBlIGBjb25zdCBjaGFyW05dJyBvcgogICAgIGBjb25zdCB3 Y2hhcl90W05dJy4gIFdlIHVzZSB0aGUgc2FtZSBsb2dpYyB3aGVuIGludm9r ZWQgYXMgYSBDCiAgICAgZnJvbnQtZW5kIHdpdGggLVd3cml0ZS1zdHJpbmdz LgogICAgID8/PyBXZSBzaG91bGQgY2hhbmdlIHRoZSB0eXBlIG9mIGFuIGV4 cHJlc3Npb24gZGVwZW5kaW5nIG9uIHRoZQogICAgIHN0YXRlIG9mIGEgd2Fy bmluZyBmbGFnLiAgV2Ugc2hvdWxkIGp1c3QgYmUgd2FybmluZyAtLSBzZWUg aG93CiAgICAgdGhpcyBpcyBoYW5kbGVkIGluIHRoZSBDKysgZnJvbnQtZW5k IGZvciB0aGUgZGVwcmVjYXRlZCBpbXBsaWNpdAogICAgIGNvbnZlcnNpb24g ZnJvbSBzdHJpbmcgbGl0ZXJhbHMgdG8gYGNoYXIqJyBvciBgd2NoYXJfdCon LgoKICAgICBUaGUgQysrIGZyb250IGVuZCByZWxpZXMgb24gVFlQRV9NQUlO X1ZBUklBTlQgb2YgYSBjdi1xdWFsaWZpZWQKICAgICBhcnJheSB0eXBlIGJl aW5nIHRoZSB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoYXQgdHlwZS4KICAg ICBUaGVyZWZvcmUsIGlmIHdlIGFyZSBjb25zdHJ1Y3RpbmcgYW4gYXJyYXkg b2YgY29uc3QgY2hhciwgd2UgbXVzdAogICAgIGNvbnN0cnVjdCB0aGUgbWF0 Y2hpbmcgdW5xdWFsaWZpZWQgYXJyYXkgdHlwZSBmaXJzdC4gIFRoZSBDIGZy b250CiAgICAgZW5kIGRvZXMgbm90IHJlcXVpcmUgdGhpcywgYnV0IGl0IGRv ZXMgbm8gaGFybSwgc28gd2UgZG8gaXQKICAgICB1bmNvbmRpdGlvbmFsbHku ICAqLwogIGVfdHlwZSA9IHdpZGVfZmxhZyA/IHdjaGFyX3R5cGVfbm9kZSA6 IGNoYXJfdHlwZV9ub2RlOwogIGlfdHlwZSA9IGJ1aWxkX2luZGV4X3R5cGUg KGJ1aWxkX2ludF9jc3QgKE5VTExfVFJFRSwgbmNoYXJzIC0gMSkpOwogIGFf dHlwZSA9IGJ1aWxkX2FycmF5X3R5cGUgKGVfdHlwZSwgaV90eXBlKTsKICBp ZiAoY19kaWFsZWN0X2N4eCgpIHx8IHdhcm5fd3JpdGVfc3RyaW5ncykKICAg IGFfdHlwZSA9IGNfYnVpbGRfcXVhbGlmaWVkX3R5cGUgKGFfdHlwZSwgVFlQ RV9RVUFMX0NPTlNUKTsKCiAgVFJFRV9UWVBFICh2YWx1ZSkgPSBhX3R5cGU7 CiAgVFJFRV9DT05TVEFOVCAodmFsdWUpID0gMTsKICBUUkVFX0lOVkFSSUFO VCAodmFsdWUpID0gMTsKICBUUkVFX1JFQURPTkxZICh2YWx1ZSkgPSAxOwog IFRSRUVfU1RBVElDICh2YWx1ZSkgPSAxOwogIHJldHVybiB2YWx1ZTsKfQoM Ci8qIFByaW50IGEgd2FybmluZyBpZiBhIGNvbnN0YW50IGV4cHJlc3Npb24g aGFkIG92ZXJmbG93IGluIGZvbGRpbmcuCiAgIEludm9rZSB0aGlzIGZ1bmN0 aW9uIG9uIGV2ZXJ5IGV4cHJlc3Npb24gdGhhdCB0aGUgbGFuZ3VhZ2UKICAg cmVxdWlyZXMgdG8gYmUgYSBjb25zdGFudCBleHByZXNzaW9uLgogICBOb3Rl IHRoZSBBTlNJIEMgc3RhbmRhcmQgc2F5cyBpdCBpcyBlcnJvbmVvdXMgZm9y IGEKICAgY29uc3RhbnQgZXhwcmVzc2lvbiB0byBvdmVyZmxvdy4gICovCgp2 b2lkCmNvbnN0YW50X2V4cHJlc3Npb25fd2FybmluZyAodHJlZSB2YWx1ZSkK ewogIGlmICgoVFJFRV9DT0RFICh2YWx1ZSkgPT0gSU5URUdFUl9DU1QgfHwg VFJFRV9DT0RFICh2YWx1ZSkgPT0gUkVBTF9DU1QKICAgICAgIHx8IFRSRUVf Q09ERSAodmFsdWUpID09IEZJWEVEX0NTVAogICAgICAgfHwgVFJFRV9DT0RF ICh2YWx1ZSkgPT0gVkVDVE9SX0NTVAogICAgICAgfHwgVFJFRV9DT0RFICh2 YWx1ZSkgPT0gQ09NUExFWF9DU1QpCiAgICAgICYmIFRSRUVfT1ZFUkZMT1cg KHZhbHVlKQogICAgICAmJiB3YXJuX292ZXJmbG93CiAgICAgICYmIHBlZGFu dGljKQogICAgcGVkd2FybiAoIm92ZXJmbG93IGluIGNvbnN0YW50IGV4cHJl c3Npb24iKTsKfQoKLyogUHJpbnQgYSB3YXJuaW5nIGlmIGFuIGV4cHJlc3Np b24gaGFkIG92ZXJmbG93IGluIGZvbGRpbmcgYW5kIGl0cwogICBvcGVyYW5k cyBoYWRuJ3QuCgogICBJbnZva2UgdGhpcyBmdW5jdGlvbiBvbiBldmVyeSBl eHByZXNzaW9uIHRoYXQKICAgKDEpIGFwcGVhcnMgaW4gdGhlIHNvdXJjZSBj b2RlLCBhbmQKICAgKDIpIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiB0aGF0 IG92ZXJmbG93ZWQsIGFuZAogICAoMykgaXMgbm90IGFscmVhZHkgY2hlY2tl ZCBieSBjb252ZXJ0X2FuZF9jaGVjazsKICAgaG93ZXZlciwgZG8gbm90IGlu dm9rZSB0aGlzIGZ1bmN0aW9uIG9uIG9wZXJhbmRzIG9mIGV4cGxpY2l0IGNh c3RzCiAgIG9yIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgdGhlIHJlc3VsdCBv ZiBhbiBvcGVyYXRvciBhbmQgYW55IG9wZXJhbmQKICAgYWxyZWFkeSBvdmVy Zmxvd2VkLiAgKi8KCnZvaWQKb3ZlcmZsb3dfd2FybmluZyAodHJlZSB2YWx1 ZSkKewogIGlmIChza2lwX2V2YWx1YXRpb24pIHJldHVybjsKCiAgc3dpdGNo IChUUkVFX0NPREUgKHZhbHVlKSkKICAgIHsKICAgIGNhc2UgSU5URUdFUl9D U1Q6CiAgICAgIHdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csICJpbnRlZ2VyIG92 ZXJmbG93IGluIGV4cHJlc3Npb24iKTsKICAgICAgYnJlYWs7CiAgICAgIAog ICAgY2FzZSBSRUFMX0NTVDoKICAgICAgd2FybmluZyAoT1BUX1dvdmVyZmxv dywgImZsb2F0aW5nIHBvaW50IG92ZXJmbG93IGluIGV4cHJlc3Npb24iKTsK ICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBGSVhFRF9DU1Q6CiAgICAg IHdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csICJmaXhlZC1wb2ludCBvdmVyZmxv dyBpbiBleHByZXNzaW9uIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgVkVD VE9SX0NTVDoKICAgICAgd2FybmluZyAoT1BUX1dvdmVyZmxvdywgInZlY3Rv ciBvdmVyZmxvdyBpbiBleHByZXNzaW9uIik7CiAgICAgIGJyZWFrOwogICAg ICAKICAgIGNhc2UgQ09NUExFWF9DU1Q6CiAgICAgIGlmIChUUkVFX0NPREUg KFRSRUVfUkVBTFBBUlQgKHZhbHVlKSkgPT0gSU5URUdFUl9DU1QpCgl3YXJu aW5nIChPUFRfV292ZXJmbG93LCAiY29tcGxleCBpbnRlZ2VyIG92ZXJmbG93 IGluIGV4cHJlc3Npb24iKTsKICAgICAgZWxzZSBpZiAoVFJFRV9DT0RFIChU UkVFX1JFQUxQQVJUICh2YWx1ZSkpID09IFJFQUxfQ1NUKQoJd2FybmluZyAo T1BUX1dvdmVyZmxvdywgImNvbXBsZXggZmxvYXRpbmcgcG9pbnQgb3ZlcmZs b3cgaW4gZXhwcmVzc2lvbiIpOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0 OgogICAgICBicmVhazsKICAgIH0KfQoKCi8qIFdhcm4gYWJvdXQgdXNlIG9m IGEgbG9naWNhbCB8fCAvICYmIG9wZXJhdG9yIGJlaW5nIHVzZWQgaW4gYQog ICBjb250ZXh0IHdoZXJlIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBiaXR3aXNl IGVxdWl2YWxlbnQgd2FzIGludGVuZGVkCiAgIGJ5IHRoZSBwcm9ncmFtbWVy LiBDT0RFIGlzIHRoZSBUUkVFX0NPREUgb2YgdGhlIG9wZXJhdG9yLCBBUkcx CiAgIGFuZCBBUkcyIHRoZSBhcmd1bWVudHMuICAqLwoKdm9pZAp3YXJuX2xv Z2ljYWxfb3BlcmF0b3IgKGVudW0gdHJlZV9jb2RlIGNvZGUsIHRyZWUgYXJn MSwgdHJlZQogICAgYXJnMikKewogIHN3aXRjaCAoY29kZSkKICAgIHsKICAg ICAgY2FzZSBUUlVUSF9BTkRJRl9FWFBSOgogICAgICBjYXNlIFRSVVRIX09S SUZfRVhQUjoKICAgICAgY2FzZSBUUlVUSF9PUl9FWFBSOgogICAgICBjYXNl IFRSVVRIX0FORF9FWFBSOgoJaWYgKCFUUkVFX05PX1dBUk5JTkcgKGFyZzEp CgkgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKGFyZzEpKQoJ ICAgICYmICFDT05TVEFOVF9DTEFTU19QIChhcmcxKQoJICAgICYmIFRSRUVf Q09ERSAoYXJnMikgPT0gSU5URUdFUl9DU1QKCSAgICAmJiAhaW50ZWdlcl96 ZXJvcCAoYXJnMikpCgkgIHsKCSAgICB3YXJuaW5nIChPUFRfV2xvZ2ljYWxf b3AsCgkJICAgICAibG9naWNhbCAlPCVzJT4gd2l0aCBub24temVybyBjb25z dGFudCAiCgkJICAgICAid2lsbCBhbHdheXMgZXZhbHVhdGUgYXMgdHJ1ZSIs CgkJICAgICAoKGNvZGUgPT0gVFJVVEhfQU5ESUZfRVhQUikKCQkgICAgICB8 fCAoY29kZSA9PSBUUlVUSF9BTkRfRVhQUikpID8gIiYmIiA6ICJ8fCIpOwoJ ICAgIFRSRUVfTk9fV0FSTklORyAoYXJnMSkgPSB0cnVlOwoJICB9CglicmVh azsKICAgICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQp9CgoKLyogUHJpbnQg YSB3YXJuaW5nIGFib3V0IGNhc3RzIHRoYXQgbWlnaHQgaW5kaWNhdGUgdmlv bGF0aW9uCiAgIG9mIHN0cmljdCBhbGlhc2luZyBydWxlcyBpZiAtV3N0cmlj dC1hbGlhc2luZyBpcyB1c2VkIGFuZAogICBzdHJpY3QgYWxpYXNpbmcgbW9k ZSBpcyBpbiBlZmZlY3QuIE9UWVBFIGlzIHRoZSBvcmlnaW5hbAogICBUUkVF X1RZUEUgb2YgRVhQUiwgYW5kIFRZUEUgdGhlIHR5cGUgd2UncmUgY2FzdGlu ZyB0by4gKi8KCmJvb2wKc3RyaWN0X2FsaWFzaW5nX3dhcm5pbmcgKHRyZWUg b3R5cGUsIHRyZWUgdHlwZSwgdHJlZSBleHByKQp7CiAgaWYgKCEoZmxhZ19z dHJpY3RfYWxpYXNpbmcgJiYgUE9JTlRFUl9UWVBFX1AgKHR5cGUpIAogICAg ICAgICYmIFBPSU5URVJfVFlQRV9QIChvdHlwZSkgJiYgIVZPSURfVFlQRV9Q IChUUkVFX1RZUEUgKHR5cGUpKSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlm ICgod2Fybl9zdHJpY3RfYWxpYXNpbmcgPiAxKSAmJiBUUkVFX0NPREUgKGV4 cHIpID09IEFERFJfRVhQUgogICAgICAmJiAoREVDTF9QIChUUkVFX09QRVJB TkQgKGV4cHIsIDApKQogICAgICAgICAgfHwgaGFuZGxlZF9jb21wb25lbnRf cCAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpKQogICAgewogICAgICAvKiBD YXN0aW5nIHRoZSBhZGRyZXNzIG9mIGFuIG9iamVjdCB0byBub24gdm9pZCBw b2ludGVyLiBXYXJuCiAgICAgICAgIGlmIHRoZSBjYXN0IGJyZWFrcyB0eXBl IGJhc2VkIGFsaWFzaW5nLiAgKi8KICAgICAgaWYgKCFDT01QTEVURV9UWVBF X1AgKFRSRUVfVFlQRSAodHlwZSkpICYmIHdhcm5fc3RyaWN0X2FsaWFzaW5n ID09IDIpCgl7CgkgIHdhcm5pbmcgKE9QVF9Xc3RyaWN0X2FsaWFzaW5nLCAi dHlwZS1wdW5uaW5nIHRvIGluY29tcGxldGUgdHlwZSAiCgkJICAgIm1pZ2h0 IGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIpOwoJICByZXR1cm4gdHJ1 ZTsKCX0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8qIHdhcm5f c3RyaWN0X2FsaWFzaW5nID49IDMuICAgVGhpcyBpbmNsdWRlcyB0aGUgZGVm YXVsdCAoMykuICAKICAgICAgICAgICAgIE9ubHkgd2FybiBpZiB0aGUgY2Fz dCBpcyBkZXJlZmVyZW5jZWQgaW1tZWRpYXRlbHkuICAqLwogICAgICAgICAg YWxpYXNfc2V0X3R5cGUgc2V0MSA9CgkgICAgZ2V0X2FsaWFzX3NldCAoVFJF RV9UWVBFIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSk7CiAgICAgICAgICBh bGlhc19zZXRfdHlwZSBzZXQyID0gZ2V0X2FsaWFzX3NldCAoVFJFRV9UWVBF ICh0eXBlKSk7CgogICAgICAgICAgaWYgKCFhbGlhc19zZXRzX2NvbmZsaWN0 X3AgKHNldDEsIHNldDIpKQoJICAgIHsKCSAgICAgIHdhcm5pbmcgKE9QVF9X c3RyaWN0X2FsaWFzaW5nLCAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCAi CgkJICAgICAgICJwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5n IHJ1bGVzIik7CgkgICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9CiAgICAgICAg ICBlbHNlIGlmICh3YXJuX3N0cmljdF9hbGlhc2luZyA9PSAyCgkJICAgJiYg IWFsaWFzX3NldHNfbXVzdF9jb25mbGljdF9wIChzZXQxLCBzZXQyKSkKCSAg ICB7CgkgICAgICB3YXJuaW5nIChPUFRfV3N0cmljdF9hbGlhc2luZywgImRl cmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgIgoJCSAgICAgICAicG9pbnRlciBt aWdodCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiKTsKCSAgICAgIHJl dHVybiB0cnVlOwoJICAgIH0KICAgICAgICB9CiAgICB9CiAgZWxzZQogICAg aWYgKCh3YXJuX3N0cmljdF9hbGlhc2luZyA9PSAxKSAmJiAhVk9JRF9UWVBF X1AgKFRSRUVfVFlQRSAob3R5cGUpKSkKICAgICAgewogICAgICAgIC8qIEF0 IHRoaXMgbGV2ZWwsIHdhcm4gZm9yIGFueSBjb252ZXJzaW9ucywgZXZlbiBp ZiBhbiBhZGRyZXNzIGlzCiAgICAgICAgICAgbm90IHRha2VuIGluIHRoZSBz YW1lIHN0YXRlbWVudC4gIFRoaXMgd2lsbCBsaWtlbHkgcHJvZHVjZSBtYW55 CiAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzLCBidXQgY291bGQgYmUgdXNl ZnVsIHRvIHBpbnBvaW50IHByb2JsZW1zIHRoYXQKICAgICAgICAgICBhcmUg bm90IHJldmVhbGVkIGF0IGhpZ2hlciBsZXZlbHMuICAqLwogICAgICAgIGFs aWFzX3NldF90eXBlIHNldDEgPSBnZXRfYWxpYXNfc2V0IChUUkVFX1RZUEUg KG90eXBlKSk7CiAgICAgICAgYWxpYXNfc2V0X3R5cGUgc2V0MiA9IGdldF9h bGlhc19zZXQgKFRSRUVfVFlQRSAodHlwZSkpOwogICAgICAgIGlmICghQ09N UExFVEVfVFlQRV9QICh0eXBlKQogICAgICAgICAgICB8fCAhYWxpYXNfc2V0 c19tdXN0X2NvbmZsaWN0X3AgKHNldDEsIHNldDIpKQoJICB7CiAgICAgICAg ICAgIHdhcm5pbmcgKE9QVF9Xc3RyaWN0X2FsaWFzaW5nLCAiZGVyZWZlcmVu Y2luZyB0eXBlLXB1bm5lZCAiCiAgICAgICAgICAgICAgICAgICAgICJwb2lu dGVyIG1pZ2h0IGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIpOwogICAg ICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgfQoKICBy ZXR1cm4gZmFsc2U7Cn0KCi8qIFByaW50IGEgd2FybmluZyBhYm91dCBpZiAo KTsgb3IgaWYgKCkgLi4gZWxzZTsgY29uc3RydWN0cwogICB2aWEgdGhlIHNw ZWNpYWwgZW1wdHkgc3RhdGVtZW50IG5vZGUgdGhhdCB3ZSBjcmVhdGUuICBJ Tk5FUl9USEVOCiAgIGFuZCBJTk5FUl9FTFNFIGFyZSB0aGUgc3RhdGVtZW50 IGxpc3RzIG9mIHRoZSBpZiBhbmQgdGhlIGVsc2UKICAgYmxvY2suICAqLwoK dm9pZAplbXB0eV9pZl9ib2R5X3dhcm5pbmcgKHRyZWUgaW5uZXJfdGhlbiwg dHJlZSBpbm5lcl9lbHNlKQp7CiAgaWYgKFRSRUVfQ09ERSAoaW5uZXJfdGhl bikgPT0gU1RBVEVNRU5UX0xJU1QKICAgICAgJiYgU1RBVEVNRU5UX0xJU1Rf VEFJTCAoaW5uZXJfdGhlbikpCiAgICBpbm5lcl90aGVuID0gU1RBVEVNRU5U X0xJU1RfVEFJTCAoaW5uZXJfdGhlbiktPnN0bXQ7CgogIGlmIChpbm5lcl9l bHNlICYmIFRSRUVfQ09ERSAoaW5uZXJfZWxzZSkgPT0gU1RBVEVNRU5UX0xJ U1QKICAgICAgJiYgU1RBVEVNRU5UX0xJU1RfVEFJTCAoaW5uZXJfZWxzZSkp CiAgICBpbm5lcl9lbHNlID0gU1RBVEVNRU5UX0xJU1RfVEFJTCAoaW5uZXJf ZWxzZSktPnN0bXQ7CgogIGlmIChJU19FTVBUWV9TVE1UIChpbm5lcl90aGVu KSAmJiAhaW5uZXJfZWxzZSkKICAgIHdhcm5pbmcgKE9QVF9XZW1wdHlfYm9k eSwgIiVIc3VnZ2VzdCBicmFjZXMgYXJvdW5kIGVtcHR5IGJvZHkgIgogICAg ICAgICAgICAgImluIGFuICU8aWYlPiBzdGF0ZW1lbnQiLCBFWFBSX0xPQ1VT IChpbm5lcl90aGVuKSk7CgogIGVsc2UgaWYgKGlubmVyX2Vsc2UgJiYgSVNf RU1QVFlfU1RNVCAoaW5uZXJfZWxzZSkpCiAgICB3YXJuaW5nIChPUFRfV2Vt cHR5X2JvZHksICIlSHN1Z2dlc3QgYnJhY2VzIGFyb3VuZCBlbXB0eSBib2R5 ICIKICAgICAgICAgICAgICJpbiBhbiAlPGVsc2UlPiBzdGF0ZW1lbnQiLCBF WFBSX0xPQ1VTIChpbm5lcl9lbHNlKSk7Cn0KCi8qIFdhcm4gZm9yIHVubGlr ZWx5LCBpbXByb2JhYmxlLCBvciBzdHVwaWQgREVDTCBkZWNsYXJhdGlvbnMK ICAgb2YgYG1haW4nLiAgKi8KCnZvaWQKY2hlY2tfbWFpbl9wYXJhbWV0ZXJf dHlwZXMgKHRyZWUgZGVjbCkKewogIHRyZWUgYXJnczsKICBpbnQgYXJnY3Qg PSAwOwoKICBmb3IgKGFyZ3MgPSBUWVBFX0FSR19UWVBFUyAoVFJFRV9UWVBF IChkZWNsKSk7IGFyZ3M7CiAgICAgIGFyZ3MgPSBUUkVFX0NIQUlOIChhcmdz KSkKICAgewogICAgIHRyZWUgdHlwZSA9IGFyZ3MgPyBUUkVFX1ZBTFVFIChh cmdzKSA6IDA7CgogICAgIGlmICh0eXBlID09IHZvaWRfdHlwZV9ub2RlIHx8 IHR5cGUgPT0gZXJyb3JfbWFya19ub2RlICkKICAgICAgIGJyZWFrOwoKICAg ICArK2FyZ2N0OwogICAgIHN3aXRjaCAoYXJnY3QpCiAgICAgICB7CiAgICAg ICBjYXNlIDE6CiAgICAgICAgIGlmIChUWVBFX01BSU5fVkFSSUFOVCAodHlw ZSkgIT0gaW50ZWdlcl90eXBlX25vZGUpCiAgICAgICAgICAgcGVkd2FybiAo ImZpcnN0IGFyZ3VtZW50IG9mICVxK0Qgc2hvdWxkIGJlICU8aW50JT4iLCBk ZWNsKTsKICAgICAgICAgYnJlYWs7CgogICAgICAgY2FzZSAyOgogICAgICAg ICBpZiAoVFJFRV9DT0RFICh0eXBlKSAhPSBQT0lOVEVSX1RZUEUKICAgICAg ICAgICAgIHx8IFRSRUVfQ09ERSAoVFJFRV9UWVBFICh0eXBlKSkgIT0gUE9J TlRFUl9UWVBFCiAgICAgICAgICAgICB8fCAoVFlQRV9NQUlOX1ZBUklBTlQg KFRSRUVfVFlQRSAoVFJFRV9UWVBFICh0eXBlKSkpCiAgICAgICAgICAgICAg ICAgIT0gY2hhcl90eXBlX25vZGUpKQogICAgICAgICAgIHBlZHdhcm4gKCJz ZWNvbmQgYXJndW1lbnQgb2YgJXErRCBzaG91bGQgYmUgJTxjaGFyICoqJT4i LAogICAgICAgICAgICAgICAgICAgIGRlY2wpOwogICAgICAgICBicmVhazsK CiAgICAgICBjYXNlIDM6CiAgICAgICAgIGlmIChUUkVFX0NPREUgKHR5cGUp ICE9IFBPSU5URVJfVFlQRQogICAgICAgICAgICAgfHwgVFJFRV9DT0RFIChU UkVFX1RZUEUgKHR5cGUpKSAhPSBQT0lOVEVSX1RZUEUKICAgICAgICAgICAg IHx8IChUWVBFX01BSU5fVkFSSUFOVCAoVFJFRV9UWVBFIChUUkVFX1RZUEUg KHR5cGUpKSkKICAgICAgICAgICAgICAgICAhPSBjaGFyX3R5cGVfbm9kZSkp CiAgICAgICAgICAgcGVkd2FybiAoInRoaXJkIGFyZ3VtZW50IG9mICVxK0Qg c2hvdWxkIHByb2JhYmx5IGJlICIKICAgICAgICAgICAgICAgICAgICAiJTxj aGFyICoqJT4iLCBkZWNsKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAg IH0KCiAgLyogSXQgaXMgaW50ZW50aW9uYWwgdGhhdCB0aGlzIG1lc3NhZ2Ug ZG9lcyBub3QgbWVudGlvbiB0aGUgdGhpcmQKICAgIGFyZ3VtZW50IGJlY2F1 c2UgaXQncyBvbmx5IG1lbnRpb25lZCBpbiBhbiBhcHBlbmRpeCBvZiB0aGUK ICAgIHN0YW5kYXJkLiAgKi8KICBpZiAoYXJnY3QgPiAwICYmIChhcmdjdCA8 IDIgfHwgYXJnY3QgPiAzKSkKICAgcGVkd2FybiAoIiVxK0QgdGFrZXMgb25s eSB6ZXJvIG9yIHR3byBhcmd1bWVudHMiLCBkZWNsKTsKfQoKLyogVHJ1ZSBp ZiB2ZWN0b3IgdHlwZXMgVDEgYW5kIFQyIGNhbiBiZSBjb252ZXJ0ZWQgdG8g ZWFjaCBvdGhlcgogICB3aXRob3V0IGFuIGV4cGxpY2l0IGNhc3QuICBJZiBF TUlUX0xBWF9OT1RFIGlzIHRydWUsIGFuZCBUMSBhbmQgVDIKICAgY2FuIG9u bHkgYmUgY29udmVydGVkIHdpdGggLWZsYXgtdmVjdG9yLWNvbnZlcnNpb25z IHlldCB0aGF0IGlzIG5vdAogICBpbiBlZmZlY3QsIGVtaXQgYSBub3RlIHRl bGxpbmcgdGhlIHVzZXIgYWJvdXQgdGhhdCBvcHRpb24gaWYgc3VjaAogICBh IG5vdGUgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gZW1pdHRlZC4gICovCmJv b2wKdmVjdG9yX3R5cGVzX2NvbnZlcnRpYmxlX3AgKGNvbnN0X3RyZWUgdDEs IGNvbnN0X3RyZWUgdDIsIGJvb2wgZW1pdF9sYXhfbm90ZSkKewogIHN0YXRp YyBib29sIGVtaXR0ZWRfbGF4X25vdGUgPSBmYWxzZTsKICBib29sIGNvbnZl cnRpYmxlX2xheDsKCiAgaWYgKCh0YXJnZXRtLnZlY3Rvcl9vcGFxdWVfcCAo dDEpIHx8IHRhcmdldG0udmVjdG9yX29wYXF1ZV9wICh0MikpCiAgICAgICYm IHRyZWVfaW50X2NzdF9lcXVhbCAoVFlQRV9TSVpFICh0MSksIFRZUEVfU0la RSAodDIpKSkKICAgIHJldHVybiB0cnVlOwoKICBjb252ZXJ0aWJsZV9sYXgg PQogICAgKHRyZWVfaW50X2NzdF9lcXVhbCAoVFlQRV9TSVpFICh0MSksIFRZ UEVfU0laRSAodDIpKQogICAgICYmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAo dDEpKSAhPSBSRUFMX1RZUEUgfHwKCSBUWVBFX1BSRUNJU0lPTiAodDEpID09 IFRZUEVfUFJFQ0lTSU9OICh0MikpCiAgICAgJiYgKElOVEVHUkFMX1RZUEVf UCAoVFJFRV9UWVBFICh0MSkpCgkgPT0gSU5URUdSQUxfVFlQRV9QIChUUkVF X1RZUEUgKHQyKSkpKTsKCiAgaWYgKCFjb252ZXJ0aWJsZV9sYXggfHwgZmxh Z19sYXhfdmVjdG9yX2NvbnZlcnNpb25zKQogICAgcmV0dXJuIGNvbnZlcnRp YmxlX2xheDsKCiAgaWYgKFRZUEVfVkVDVE9SX1NVQlBBUlRTICh0MSkgPT0g VFlQRV9WRUNUT1JfU1VCUEFSVFMgKHQyKQogICAgICAmJiBjb21wdHlwZXMg KFRSRUVfVFlQRSAodDEpLCBUUkVFX1RZUEUgKHQyKSkpCiAgICByZXR1cm4g dHJ1ZTsKCiAgaWYgKGVtaXRfbGF4X25vdGUgJiYgIWVtaXR0ZWRfbGF4X25v dGUpCiAgICB7CiAgICAgIGVtaXR0ZWRfbGF4X25vdGUgPSB0cnVlOwogICAg ICBpbmZvcm0gKCJ1c2UgLWZsYXgtdmVjdG9yLWNvbnZlcnNpb25zIHRvIHBl cm1pdCAiCiAgICAgICAgICAgICAgImNvbnZlcnNpb25zIGJldHdlZW4gdmVj dG9ycyB3aXRoIGRpZmZlcmluZyAiCiAgICAgICAgICAgICAgImVsZW1lbnQg dHlwZXMgb3IgbnVtYmVycyBvZiBzdWJwYXJ0cyIpOwogICAgfQoKICByZXR1 cm4gZmFsc2U7Cn0KCi8qIFdhcm5zIGlmIHRoZSBjb252ZXJzaW9uIG9mIEVY UFIgdG8gVFlQRSBtYXkgYWx0ZXIgYSB2YWx1ZS4KICAgVGhpcyBpcyBhIGhl bHBlciBmdW5jdGlvbiBmb3Igd2FybmluZ3NfZm9yX2NvbnZlcnRfYW5kX2No ZWNrLiAgKi8KCnN0YXRpYyB2b2lkCmNvbnZlcnNpb25fd2FybmluZyAodHJl ZSB0eXBlLCB0cmVlIGV4cHIpCnsKICBib29sIGdpdmVfd2FybmluZyA9IGZh bHNlOwoKICB1bnNpZ25lZCBpbnQgZm9ybWFsX3ByZWMgPSBUWVBFX1BSRUNJ U0lPTiAodHlwZSk7CgogIGlmICghd2Fybl9jb252ZXJzaW9uICYmICF3YXJu X3NpZ25fY29udmVyc2lvbikKICAgIHJldHVybjsKCiAgaWYgKFRSRUVfQ09E RSAoZXhwcikgPT0gUkVBTF9DU1QgfHwgVFJFRV9DT0RFIChleHByKSA9PSBJ TlRFR0VSX0NTVCkKICAgIHsKICAgICAgLyogV2FybiBmb3IgcmVhbCBjb25z dGFudCB0aGF0IGlzIG5vdCBhbiBleGFjdCBpbnRlZ2VyIGNvbnZlcnRlZAog ICAgICAgICB0byBpbnRlZ2VyIHR5cGUuICAqLwogICAgICBpZiAoVFJFRV9D T0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBSRUFMX1RZUEUKICAgICAgICAg ICYmIFRSRUVfQ09ERSAodHlwZSkgPT0gSU5URUdFUl9UWVBFKQogICAgICAg IHsKICAgICAgICAgIGlmICghcmVhbF9pc2ludGVnZXIgKFRSRUVfUkVBTF9D U1RfUFRSIChleHByKSwgVFlQRV9NT0RFIChUUkVFX1RZUEUgKGV4cHIpKSkp CiAgICAgICAgICAgIGdpdmVfd2FybmluZyA9IHRydWU7CiAgICAgICAgfQog ICAgICAvKiBXYXJuIGZvciBhbiBpbnRlZ2VyIGNvbnN0YW50IHRoYXQgZG9l cyBub3QgZml0IGludG8gaW50ZWdlciB0eXBlLiAgKi8KICAgICAgZWxzZSBp ZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBJTlRFR0VSX1RZ UEUKICAgICAgICAgICAgICAgJiYgVFJFRV9DT0RFICh0eXBlKSA9PSBJTlRF R0VSX1RZUEUKICAgICAgICAgICAgICAgJiYgIWludF9maXRzX3R5cGVfcCAo ZXhwciwgdHlwZSkpCiAgICAgICAgewogICAgICAgICAgaWYgKFRZUEVfVU5T SUdORUQgKHR5cGUpICYmICFUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKGV4 cHIpKSkKCSAgICB3YXJuaW5nIChPUFRfV3NpZ25fY29udmVyc2lvbiwKCQkg ICAgICJuZWdhdGl2ZSBpbnRlZ2VyIGltcGxpY2l0bHkgY29udmVydGVkIHRv IHVuc2lnbmVkIHR5cGUiKTsKICAgICAgICAgIGVsc2UgaWYgKCFUWVBFX1VO U0lHTkVEICh0eXBlKSAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKGV4 cHIpKSkKCSAgICB3YXJuaW5nIChPUFRfV3NpZ25fY29udmVyc2lvbiwKCQkg ICAgICJjb252ZXJzaW9uIG9mIHVuc2lnbmVkIGNvbnN0YW50IHZhbHVlIHRv IG5lZ2F0aXZlIGludGVnZXIiKTsKCSAgZWxzZQoJICAgIGdpdmVfd2Fybmlu ZyA9IHRydWU7CiAgICAgICAgfQogICAgICBlbHNlIGlmIChUUkVFX0NPREUg KHR5cGUpID09IFJFQUxfVFlQRSkKICAgICAgICB7CiAgICAgICAgICAvKiBX YXJuIGZvciBhbiBpbnRlZ2VyIGNvbnN0YW50IHRoYXQgZG9lcyBub3QgZml0 IGludG8gcmVhbCB0eXBlLiAgKi8KICAgICAgICAgIGlmIChUUkVFX0NPREUg KFRSRUVfVFlQRSAoZXhwcikpID09IElOVEVHRVJfVFlQRSkKICAgICAgICAg ICAgewogICAgICAgICAgICAgIFJFQUxfVkFMVUVfVFlQRSBhID0gcmVhbF92 YWx1ZV9mcm9tX2ludF9jc3QgKDAsIGV4cHIpOwogICAgICAgICAgICAgIGlm ICghZXhhY3RfcmVhbF90cnVuY2F0ZSAoVFlQRV9NT0RFICh0eXBlKSwgJmEp KQogICAgICAgICAgICAgICAgZ2l2ZV93YXJuaW5nID0gdHJ1ZTsKICAgICAg ICAgICAgfQogICAgICAgICAgLyogV2FybiBmb3IgYSByZWFsIGNvbnN0YW50 IHRoYXQgZG9lcyBub3QgZml0IGludG8gYSBzbWFsbGVyCiAgICAgICAgICAg ICByZWFsIHR5cGUuICAqLwogICAgICAgICAgZWxzZSBpZiAoVFJFRV9DT0RF IChUUkVFX1RZUEUgKGV4cHIpKSA9PSBSRUFMX1RZUEUKICAgICAgICAgICAg ICAgICAgICYmIGZvcm1hbF9wcmVjIDwgVFlQRV9QUkVDSVNJT04gKFRSRUVf VFlQRSAoZXhwcikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgUkVB TF9WQUxVRV9UWVBFIGEgPSBUUkVFX1JFQUxfQ1NUIChleHByKTsKICAgICAg ICAgICAgICBpZiAoIWV4YWN0X3JlYWxfdHJ1bmNhdGUgKFRZUEVfTU9ERSAo dHlwZSksICZhKSkKICAgICAgICAgICAgICAgIGdpdmVfd2FybmluZyA9IHRy dWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICBpZiAoZ2l2ZV93 YXJuaW5nKQogICAgICAgIHdhcm5pbmcgKE9QVF9XY29udmVyc2lvbiwKICAg ICAgICAgICAgICAgICAiY29udmVyc2lvbiB0byAlcVQgYWx0ZXJzICVxVCBj b25zdGFudCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgdHlwZSwgVFJFRV9U WVBFIChleHByKSk7CiAgICB9CiAgZWxzZSAvKiAnZXhwcicgaXMgbm90IGEg Y29uc3RhbnQuICAqLwogICAgewogICAgICAvKiBXYXJuIGZvciByZWFsIHR5 cGVzIGNvbnZlcnRlZCB0byBpbnRlZ2VyIHR5cGVzLiAgKi8KICAgICAgaWYg KFRSRUVfQ09ERSAoVFJFRV9UWVBFIChleHByKSkgPT0gUkVBTF9UWVBFCiAg ICAgICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IElOVEVHRVJfVFlQRSkK ICAgICAgICBnaXZlX3dhcm5pbmcgPSB0cnVlOwoKICAgICAgZWxzZSBpZiAo VFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBJTlRFR0VSX1RZUEUK ICAgICAgICAgICAgICAgJiYgVFJFRV9DT0RFICh0eXBlKSA9PSBJTlRFR0VS X1RZUEUpCiAgICAgICAgewoJICAvKiBEb24ndCB3YXJuIGFib3V0IHVuc2ln bmVkIGNoYXIgeSA9IDB4ZmYsIHggPSAoaW50KSB5OyAgKi8KCSAgZXhwciA9 IGdldF91bndpZGVuZWQgKGV4cHIsIDApOwoKICAgICAgICAgIC8qIFdhcm4g Zm9yIGludGVnZXIgdHlwZXMgY29udmVydGVkIHRvIHNtYWxsZXIgaW50ZWdl ciB0eXBlcy4gICovCiAgICAgICAgICBpZiAoZm9ybWFsX3ByZWMgPCBUWVBF X1BSRUNJU0lPTiAoVFJFRV9UWVBFIChleHByKSkpIAoJICAgIGdpdmVfd2Fy bmluZyA9IHRydWU7CgoJICAvKiBXaGVuIHRoZXkgYXJlIHRoZSBzYW1lIHdp ZHRoIGJ1dCBkaWZmZXJlbnQgc2lnbmVkbmVzcywKCSAgICAgdGhlbiB0aGUg dmFsdWUgbWF5IGNoYW5nZS4gICovCgkgIGVsc2UgaWYgKChmb3JtYWxfcHJl YyA9PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChleHByKSkKCQkgICAg JiYgVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChleHByKSkgIT0gVFlQRV9V TlNJR05FRCAodHlwZSkpCgkJICAgLyogRXZlbiB3aGVuIGNvbnZlcnRlZCB0 byBhIGJpZ2dlciB0eXBlLCBpZiB0aGUgdHlwZSBpcwoJCSAgICAgIHVuc2ln bmVkIGJ1dCBleHByIGlzIHNpZ25lZCwgdGhlbiBuZWdhdGl2ZSB2YWx1ZXMK CQkgICAgICB3aWxsIGJlIGNoYW5nZWQuICAqLwoJCSAgIHx8IChUWVBFX1VO U0lHTkVEICh0eXBlKSAmJiAhVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChl eHByKSkpKQoJICAgIHdhcm5pbmcgKE9QVF9Xc2lnbl9jb252ZXJzaW9uLAoJ CSAgICAgImNvbnZlcnNpb24gdG8gJXFUIGZyb20gJXFUIG1heSBjaGFuZ2Ug dGhlIHNpZ24gb2YgdGhlIHJlc3VsdCIsCgkJICAgICB0eXBlLCBUUkVFX1RZ UEUgKGV4cHIpKTsKICAgICAgICB9CgogICAgICAvKiBXYXJuIGZvciBpbnRl Z2VyIHR5cGVzIGNvbnZlcnRlZCB0byByZWFsIHR5cGVzIGlmIGFuZCBvbmx5 IGlmCiAgICAgICAgIGFsbCB0aGUgcmFuZ2Ugb2YgdmFsdWVzIG9mIHRoZSBp bnRlZ2VyIHR5cGUgY2Fubm90IGJlCiAgICAgICAgIHJlcHJlc2VudGVkIGJ5 IHRoZSByZWFsIHR5cGUuICAqLwogICAgICBlbHNlIGlmIChUUkVFX0NPREUg KFRSRUVfVFlQRSAoZXhwcikpID09IElOVEVHRVJfVFlQRQogICAgICAgICAg ICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IFJFQUxfVFlQRSkKICAgICAg ICB7CiAgICAgICAgICB0cmVlIHR5cGVfbG93X2JvdW5kID0gVFlQRV9NSU5f VkFMVUUgKFRSRUVfVFlQRSAoZXhwcikpOwogICAgICAgICAgdHJlZSB0eXBl X2hpZ2hfYm91bmQgPSBUWVBFX01BWF9WQUxVRSAoVFJFRV9UWVBFIChleHBy KSk7CiAgICAgICAgICBSRUFMX1ZBTFVFX1RZUEUgcmVhbF9sb3dfYm91bmQg PSByZWFsX3ZhbHVlX2Zyb21faW50X2NzdCAoMCwgdHlwZV9sb3dfYm91bmQp OwogICAgICAgICAgUkVBTF9WQUxVRV9UWVBFIHJlYWxfaGlnaF9ib3VuZCA9 IHJlYWxfdmFsdWVfZnJvbV9pbnRfY3N0ICgwLCB0eXBlX2hpZ2hfYm91bmQp OwoKICAgICAgICAgIGlmICghZXhhY3RfcmVhbF90cnVuY2F0ZSAoVFlQRV9N T0RFICh0eXBlKSwgJnJlYWxfbG93X2JvdW5kKQogICAgICAgICAgICAgIHx8 ICFleGFjdF9yZWFsX3RydW5jYXRlIChUWVBFX01PREUgKHR5cGUpLCAmcmVh bF9oaWdoX2JvdW5kKSkKICAgICAgICAgICAgZ2l2ZV93YXJuaW5nID0gdHJ1 ZTsKICAgICAgICB9CgogICAgICAvKiBXYXJuIGZvciByZWFsIHR5cGVzIGNv bnZlcnRlZCB0byBzbWFsbGVyIHJlYWwgdHlwZXMuICAqLwogICAgICBlbHNl IGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAoZXhwcikpID09IFJFQUxfVFlQ RQogICAgICAgICAgICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IFJFQUxf VFlQRQogICAgICAgICAgICAgICAmJiBmb3JtYWxfcHJlYyA8IFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKSkKICAgICAgICBnaXZlX3dhcm5p bmcgPSB0cnVlOwoKCiAgICAgIGlmIChnaXZlX3dhcm5pbmcpCiAgICAgICAg d2FybmluZyAoT1BUX1djb252ZXJzaW9uLAogICAgICAgICAgICAgICAgICJj b252ZXJzaW9uIHRvICVxVCBmcm9tICVxVCBtYXkgYWx0ZXIgaXRzIHZhbHVl IiwKICAgICAgICAgICAgICAgICB0eXBlLCBUUkVFX1RZUEUgKGV4cHIpKTsK ICAgIH0KfQoKLyogUHJvZHVjZSB3YXJuaW5ncyBhZnRlciBhIGNvbnZlcnNp b24uIFJFU1VMVCBpcyB0aGUgcmVzdWx0IG9mCiAgIGNvbnZlcnRpbmcgRVhQ UiB0byBUWVBFLiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IKICAg Y29udmVydF9hbmRfY2hlY2sgYW5kIGNwX2NvbnZlcnRfYW5kX2NoZWNrLiAg Ki8KCnZvaWQKd2FybmluZ3NfZm9yX2NvbnZlcnRfYW5kX2NoZWNrICh0cmVl IHR5cGUsIHRyZWUgZXhwciwgdHJlZSByZXN1bHQpCnsKICBpZiAoVFJFRV9D T0RFIChleHByKSA9PSBJTlRFR0VSX0NTVAogICAgICAmJiAoVFJFRV9DT0RF ICh0eXBlKSA9PSBJTlRFR0VSX1RZUEUKICAgICAgICAgIHx8IFRSRUVfQ09E RSAodHlwZSkgPT0gRU5VTUVSQUxfVFlQRSkKICAgICAgJiYgIWludF9maXRz X3R5cGVfcCAoZXhwciwgdHlwZSkpCiAgICB7CiAgICAgIC8qIERvIG5vdCBk aWFnbm9zZSBvdmVyZmxvdyBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gbWVy ZWx5CiAgICAgICAgIGJlY2F1c2UgYSBjb252ZXJzaW9uIG92ZXJmbG93ZWQu ICAqLwogICAgICBpZiAoVFJFRV9PVkVSRkxPVyAocmVzdWx0KSkKICAgICAg ICBUUkVFX09WRVJGTE9XIChyZXN1bHQpID0gVFJFRV9PVkVSRkxPVyAoZXhw cik7CgogICAgICBpZiAoVFlQRV9VTlNJR05FRCAodHlwZSkpCiAgICAgICAg ewogICAgICAgICAgLyogVGhpcyBkZXRlY3RzIGNhc2VzIGxpa2UgY29udmVy dGluZyAtMTI5IG9yIDI1NiB0bwogICAgICAgICAgICAgdW5zaWduZWQgY2hh ci4gICovCiAgICAgICAgICBpZiAoIWludF9maXRzX3R5cGVfcCAoZXhwciwg Y19jb21tb25fc2lnbmVkX3R5cGUgKHR5cGUpKSkKICAgICAgICAgICAgd2Fy bmluZyAoT1BUX1dvdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgImxh cmdlIGludGVnZXIgaW1wbGljaXRseSB0cnVuY2F0ZWQgdG8gdW5zaWduZWQg dHlwZSIpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBjb252ZXJzaW9u X3dhcm5pbmcgKHR5cGUsIGV4cHIpOwogICAgICAgIH0KICAgICAgZWxzZSBp ZiAoIWludF9maXRzX3R5cGVfcCAoZXhwciwgY19jb21tb25fdW5zaWduZWRf dHlwZSAodHlwZSkpKSAKCXdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csCgkJICJv dmVyZmxvdyBpbiBpbXBsaWNpdCBjb25zdGFudCBjb252ZXJzaW9uIik7CiAg ICAgIC8qIE5vIHdhcm5pbmcgZm9yIGNvbnZlcnRpbmcgMHg4MDAwMDAwMCB0 byBpbnQuICAqLwogICAgICBlbHNlIGlmIChwZWRhbnRpYwoJICAgICAgICYm IChUUkVFX0NPREUgKFRSRUVfVFlQRSAoZXhwcikpICE9IElOVEVHRVJfVFlQ RQoJCSAgIHx8IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKQoJ CSAgICE9IFRZUEVfUFJFQ0lTSU9OICh0eXBlKSkpCgl3YXJuaW5nIChPUFRf V292ZXJmbG93LAoJCSAib3ZlcmZsb3cgaW4gaW1wbGljaXQgY29uc3RhbnQg Y29udmVyc2lvbiIpOwoKICAgICAgZWxzZQoJY29udmVyc2lvbl93YXJuaW5n ICh0eXBlLCBleHByKTsKICAgIH0KICBlbHNlIGlmICgoVFJFRV9DT0RFIChy ZXN1bHQpID09IElOVEVHRVJfQ1NUCgkgICAgfHwgVFJFRV9DT0RFIChyZXN1 bHQpID09IEZJWEVEX0NTVCkgJiYgVFJFRV9PVkVSRkxPVyAocmVzdWx0KSkK ICAgIHdhcm5pbmcgKE9QVF9Xb3ZlcmZsb3csCiAgICAgICAgICAgICAib3Zl cmZsb3cgaW4gaW1wbGljaXQgY29uc3RhbnQgY29udmVyc2lvbiIpOwogIGVs c2UKICAgIGNvbnZlcnNpb25fd2FybmluZyAodHlwZSwgZXhwcik7Cn0KCgov KiBDb252ZXJ0IEVYUFIgdG8gVFlQRSwgd2FybmluZyBhYm91dCBjb252ZXJz aW9uIHByb2JsZW1zIHdpdGggY29uc3RhbnRzLgogICBJbnZva2UgdGhpcyBm dW5jdGlvbiBvbiBldmVyeSBleHByZXNzaW9uIHRoYXQgaXMgY29udmVydGVk IGltcGxpY2l0bHksCiAgIGkuZS4gYmVjYXVzZSBvZiBsYW5ndWFnZSBydWxl cyBhbmQgbm90IGJlY2F1c2Ugb2YgYW4gZXhwbGljaXQgY2FzdC4gICovCgp0 cmVlCmNvbnZlcnRfYW5kX2NoZWNrICh0cmVlIHR5cGUsIHRyZWUgZXhwcikK ewogIHRyZWUgcmVzdWx0OwoKICBpZiAoVFJFRV9UWVBFIChleHByKSA9PSB0 eXBlKQogICAgcmV0dXJuIGV4cHI7CiAgCiAgcmVzdWx0ID0gY29udmVydCAo dHlwZSwgZXhwcik7CgogIGlmICghc2tpcF9ldmFsdWF0aW9uICYmICFUUkVF X09WRVJGTE9XX1AgKGV4cHIpICYmIHJlc3VsdCAhPSBlcnJvcl9tYXJrX25v ZGUpCiAgICB3YXJuaW5nc19mb3JfY29udmVydF9hbmRfY2hlY2sgKHR5cGUs IGV4cHIsIHJlc3VsdCk7CgogIHJldHVybiByZXN1bHQ7Cn0KDAovKiBBIG5v ZGUgaW4gYSBsaXN0IHRoYXQgZGVzY3JpYmVzIHJlZmVyZW5jZXMgdG8gdmFy aWFibGVzIChFWFBSKSwgd2hpY2ggYXJlCiAgIGVpdGhlciByZWFkIGFjY2Vz c2VzIGlmIFdSSVRFUiBpcyB6ZXJvLCBvciB3cml0ZSBhY2Nlc3NlcywgaW4g d2hpY2ggY2FzZQogICBXUklURVIgaXMgdGhlIHBhcmVudCBvZiBFWFBSLiAg Ki8Kc3RydWN0IHRsaXN0CnsKICBzdHJ1Y3QgdGxpc3QgKm5leHQ7CiAgdHJl ZSBleHByLCB3cml0ZXI7Cn07CgovKiBVc2VkIHRvIGltcGxlbWVudCBhIGNh Y2hlIHRoZSByZXN1bHRzIG9mIGEgY2FsbCB0byB2ZXJpZnlfdHJlZS4gIFdl IG9ubHkKICAgdXNlIHRoaXMgZm9yIFNBVkVfRVhQUnMuICAqLwpzdHJ1Y3Qg dGxpc3RfY2FjaGUKewogIHN0cnVjdCB0bGlzdF9jYWNoZSAqbmV4dDsKICBz dHJ1Y3QgdGxpc3QgKmNhY2hlX2JlZm9yZV9zcDsKICBzdHJ1Y3QgdGxpc3Qg KmNhY2hlX2FmdGVyX3NwOwogIHRyZWUgZXhwcjsKfTsKCi8qIE9ic3RhY2sg dG8gdXNlIHdoZW4gYWxsb2NhdGluZyB0bGlzdCBzdHJ1Y3R1cmVzLCBhbmQg Y29ycmVzcG9uZGluZwogICBmaXJzdG9iai4gICovCnN0YXRpYyBzdHJ1Y3Qg b2JzdGFjayB0bGlzdF9vYnN0YWNrOwpzdGF0aWMgY2hhciAqdGxpc3RfZmly c3RvYmogPSAwOwoKLyogS2VlcCB0cmFjayBvZiB0aGUgaWRlbnRpZmllcnMg d2UndmUgd2FybmVkIGFib3V0LCBzbyB3ZSBjYW4gYXZvaWQgZHVwbGljYXRl CiAgIHdhcm5pbmdzLiAgKi8Kc3RhdGljIHN0cnVjdCB0bGlzdCAqd2FybmVk X2lkczsKLyogU0FWRV9FWFBScyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50LiAg V2UgcHJvY2VzcyB0aGVtIG9ubHkgb25jZSBhbmQgdGhlbgogICBjYWNoZSB0 aGUgcmVzdWx0cy4gICovCnN0YXRpYyBzdHJ1Y3QgdGxpc3RfY2FjaGUgKnNh dmVfZXhwcl9jYWNoZTsKCnN0YXRpYyB2b2lkIGFkZF90bGlzdCAoc3RydWN0 IHRsaXN0ICoqLCBzdHJ1Y3QgdGxpc3QgKiwgdHJlZSwgaW50KTsKc3RhdGlj IHZvaWQgbWVyZ2VfdGxpc3QgKHN0cnVjdCB0bGlzdCAqKiwgc3RydWN0IHRs aXN0ICosIGludCk7CnN0YXRpYyB2b2lkIHZlcmlmeV90cmVlICh0cmVlLCBz dHJ1Y3QgdGxpc3QgKiosIHN0cnVjdCB0bGlzdCAqKiwgdHJlZSk7CnN0YXRp YyBpbnQgd2FybmluZ19jYW5kaWRhdGVfcCAodHJlZSk7CnN0YXRpYyB2b2lk IHdhcm5fZm9yX2NvbGxpc2lvbnMgKHN0cnVjdCB0bGlzdCAqKTsKc3RhdGlj IHZvaWQgd2Fybl9mb3JfY29sbGlzaW9uc18xICh0cmVlLCB0cmVlLCBzdHJ1 Y3QgdGxpc3QgKiwgaW50KTsKc3RhdGljIHN0cnVjdCB0bGlzdCAqbmV3X3Rs aXN0IChzdHJ1Y3QgdGxpc3QgKiwgdHJlZSwgdHJlZSk7CgovKiBDcmVhdGUg YSBuZXcgc3RydWN0IHRsaXN0IGFuZCBmaWxsIGluIGl0cyBmaWVsZHMuICAq LwpzdGF0aWMgc3RydWN0IHRsaXN0ICoKbmV3X3RsaXN0IChzdHJ1Y3QgdGxp c3QgKm5leHQsIHRyZWUgdCwgdHJlZSB3cml0ZXIpCnsKICBzdHJ1Y3QgdGxp c3QgKmw7CiAgbCA9IFhPQk5FVyAoJnRsaXN0X29ic3RhY2ssIHN0cnVjdCB0 bGlzdCk7CiAgbC0+bmV4dCA9IG5leHQ7CiAgbC0+ZXhwciA9IHQ7CiAgbC0+ d3JpdGVyID0gd3JpdGVyOwogIHJldHVybiBsOwp9CgovKiBBZGQgZHVwbGlj YXRlcyBvZiB0aGUgbm9kZXMgZm91bmQgaW4gQUREIHRvIHRoZSBsaXN0ICpU Ty4gIElmIEVYQ0xVREVfV1JJVEVSCiAgIGlzIG5vbm51bGwsIHdlIGlnbm9y ZSBhbnkgbm9kZSB3ZSBmaW5kIHdoaWNoIGhhcyBhIHdyaXRlciBlcXVhbCB0 byBpdC4gICovCgpzdGF0aWMgdm9pZAphZGRfdGxpc3QgKHN0cnVjdCB0bGlz dCAqKnRvLCBzdHJ1Y3QgdGxpc3QgKmFkZCwgdHJlZSBleGNsdWRlX3dyaXRl ciwgaW50IGNvcHkpCnsKICB3aGlsZSAoYWRkKQogICAgewogICAgICBzdHJ1 Y3QgdGxpc3QgKm5leHQgPSBhZGQtPm5leHQ7CiAgICAgIGlmICghY29weSkK CWFkZC0+bmV4dCA9ICp0bzsKICAgICAgaWYgKCFleGNsdWRlX3dyaXRlciB8 fCBhZGQtPndyaXRlciAhPSBleGNsdWRlX3dyaXRlcikKCSp0byA9IGNvcHkg PyBuZXdfdGxpc3QgKCp0bywgYWRkLT5leHByLCBhZGQtPndyaXRlcikgOiBh ZGQ7CiAgICAgIGFkZCA9IG5leHQ7CiAgICB9Cn0KCi8qIE1lcmdlIHRoZSBu b2RlcyBvZiBBREQgaW50byBUTy4gIFRoaXMgbWVyZ2luZyBwcm9jZXNzIGlz IGRvbmUgc28gdGhhdCBmb3IKICAgZWFjaCB2YXJpYWJsZSB0aGF0IGFscmVh ZHkgZXhpc3RzIGluIFRPLCBubyBuZXcgbm9kZSBpcyBhZGRlZDsgaG93ZXZl ciBpZgogICB0aGVyZSBpcyBhIHdyaXRlIGFjY2VzcyByZWNvcmRlZCBpbiBB REQsIGFuZCBhbiBvY2N1cnJlbmNlIG9uIFRPIGlzIG9ubHkKICAgYSByZWFk IGFjY2VzcywgdGhlbiB0aGUgb2NjdXJyZW5jZSBpbiBUTyB3aWxsIGJlIG1v ZGlmaWVkIHRvIHJlY29yZCB0aGUKICAgd3JpdGUuICAqLwoKc3RhdGljIHZv aWQKbWVyZ2VfdGxpc3QgKHN0cnVjdCB0bGlzdCAqKnRvLCBzdHJ1Y3QgdGxp c3QgKmFkZCwgaW50IGNvcHkpCnsKICBzdHJ1Y3QgdGxpc3QgKiplbmQgPSB0 bzsKCiAgd2hpbGUgKCplbmQpCiAgICBlbmQgPSAmKCplbmQpLT5uZXh0OwoK ICB3aGlsZSAoYWRkKQogICAgewogICAgICBpbnQgZm91bmQgPSAwOwogICAg ICBzdHJ1Y3QgdGxpc3QgKnRtcDI7CiAgICAgIHN0cnVjdCB0bGlzdCAqbmV4 dCA9IGFkZC0+bmV4dDsKCiAgICAgIGZvciAodG1wMiA9ICp0bzsgdG1wMjsg dG1wMiA9IHRtcDItPm5leHQpCglpZiAodG1wMi0+ZXhwciA9PSBhZGQtPmV4 cHIpCgkgIHsKCSAgICBmb3VuZCA9IDE7CgkgICAgaWYgKCF0bXAyLT53cml0 ZXIpCgkgICAgICB0bXAyLT53cml0ZXIgPSBhZGQtPndyaXRlcjsKCSAgfQog ICAgICBpZiAoIWZvdW5kKQoJewoJICAqZW5kID0gY29weSA/IGFkZCA6IG5l d190bGlzdCAoTlVMTCwgYWRkLT5leHByLCBhZGQtPndyaXRlcik7CgkgIGVu ZCA9ICYoKmVuZCktPm5leHQ7CgkgICplbmQgPSAwOwoJfQogICAgICBhZGQg PSBuZXh0OwogICAgfQp9CgovKiBXUklUVEVOIGlzIGEgdmFyaWFibGUsIFdS SVRFUiBpcyBpdHMgcGFyZW50LiAgV2FybiBpZiBhbnkgb2YgdGhlIHZhcmlh YmxlCiAgIHJlZmVyZW5jZXMgaW4gbGlzdCBMSVNUIGNvbmZsaWN0IHdpdGgg aXQsIGV4Y2x1ZGluZyByZWFkcyBpZiBPTkxZIHdyaXRlcnMKICAgaXMgbm9u emVyby4gICovCgpzdGF0aWMgdm9pZAp3YXJuX2Zvcl9jb2xsaXNpb25zXzEg KHRyZWUgd3JpdHRlbiwgdHJlZSB3cml0ZXIsIHN0cnVjdCB0bGlzdCAqbGlz dCwKCQkgICAgICAgaW50IG9ubHlfd3JpdGVzKQp7CiAgc3RydWN0IHRsaXN0 ICp0bXA7CgogIC8qIEF2b2lkIGR1cGxpY2F0ZSB3YXJuaW5ncy4gICovCiAg Zm9yICh0bXAgPSB3YXJuZWRfaWRzOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkK ICAgIGlmICh0bXAtPmV4cHIgPT0gd3JpdHRlbikKICAgICAgcmV0dXJuOwoK ICB3aGlsZSAobGlzdCkKICAgIHsKICAgICAgaWYgKGxpc3QtPmV4cHIgPT0g d3JpdHRlbgoJICAmJiBsaXN0LT53cml0ZXIgIT0gd3JpdGVyCgkgICYmICgh b25seV93cml0ZXMgfHwgbGlzdC0+d3JpdGVyKQoJICAmJiBERUNMX05BTUUg KGxpc3QtPmV4cHIpKQoJewoJICB3YXJuZWRfaWRzID0gbmV3X3RsaXN0ICh3 YXJuZWRfaWRzLCB3cml0dGVuLCBOVUxMX1RSRUUpOwoJICB3YXJuaW5nICgw LCAib3BlcmF0aW9uIG9uICVxRSBtYXkgYmUgdW5kZWZpbmVkIiwgbGlzdC0+ ZXhwcik7Cgl9CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQp9Cgov KiBHaXZlbiBhIGxpc3QgTElTVCBvZiByZWZlcmVuY2VzIHRvIHZhcmlhYmxl cywgZmluZCB3aGV0aGVyIGFueSBvZiB0aGVzZQogICBjYW4gY2F1c2UgY29u ZmxpY3RzIGR1ZSB0byBtaXNzaW5nIHNlcXVlbmNlIHBvaW50cy4gICovCgpz dGF0aWMgdm9pZAp3YXJuX2Zvcl9jb2xsaXNpb25zIChzdHJ1Y3QgdGxpc3Qg Kmxpc3QpCnsKICBzdHJ1Y3QgdGxpc3QgKnRtcDsKCiAgZm9yICh0bXAgPSBs aXN0OyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKICAgIHsKICAgICAgaWYgKHRt cC0+d3JpdGVyKQoJd2Fybl9mb3JfY29sbGlzaW9uc18xICh0bXAtPmV4cHIs IHRtcC0+d3JpdGVyLCBsaXN0LCAwKTsKICAgIH0KfQoKLyogUmV0dXJuIG5v bnplcm8gaWYgWCBpcyBhIHRyZWUgdGhhdCBjYW4gYmUgdmVyaWZpZWQgYnkg dGhlIHNlcXVlbmNlIHBvaW50CiAgIHdhcm5pbmdzLiAgKi8Kc3RhdGljIGlu dAp3YXJuaW5nX2NhbmRpZGF0ZV9wICh0cmVlIHgpCnsKICByZXR1cm4gVFJF RV9DT0RFICh4KSA9PSBWQVJfREVDTCB8fCBUUkVFX0NPREUgKHgpID09IFBB Uk1fREVDTDsKfQoKLyogV2FsayB0aGUgdHJlZSBYLCBhbmQgcmVjb3JkIGFj Y2Vzc2VzIHRvIHZhcmlhYmxlcy4gIElmIFggaXMgd3JpdHRlbiBieSB0aGUK ICAgcGFyZW50IHRyZWUsIFdSSVRFUiBpcyB0aGUgcGFyZW50LgogICBXZSBz dG9yZSBhY2Nlc3NlcyBpbiBvbmUgb2YgdGhlIHR3byBsaXN0czogUEJFRk9S RV9TUCwgYW5kIFBOT19TUC4gIElmIHRoaXMKICAgZXhwcmVzc2lvbiBvciBp dHMgb25seSBvcGVyYW5kIGZvcmNlcyBhIHNlcXVlbmNlIHBvaW50LCB0aGVu IGV2ZXJ5dGhpbmcgdXAKICAgdG8gdGhlIHNlcXVlbmNlIHBvaW50IGlzIHN0 b3JlZCBpbiBQQkVGT1JFX1NQLiAgRXZlcnl0aGluZyBlbHNlIGdldHMgc3Rv cmVkCiAgIGluIFBOT19TUC4KICAgT25jZSB3ZSByZXR1cm4sIHdlIHdpbGwg aGF2ZSBlbWl0dGVkIHdhcm5pbmdzIGlmIGFueSBzdWJleHByZXNzaW9uIGJl Zm9yZQogICBzdWNoIGEgc2VxdWVuY2UgcG9pbnQgY291bGQgYmUgdW5kZWZp bmVkLiAgT24gYSBoaWdoZXIgbGV2ZWwsIGhvd2V2ZXIsIHRoZQogICBzZXF1 ZW5jZSBwb2ludCBtYXkgbm90IGJlIHJlbGV2YW50LCBhbmQgd2UnbGwgbWVy Z2UgdGhlIHR3byBsaXN0cy4KCiAgIEV4YW1wbGU6IChiKyssIGEpICsgYjsK ICAgVGhlIGNhbGwgdGhhdCBwcm9jZXNzZXMgdGhlIENPTVBPVU5EX0VYUFIg d2lsbCBzdG9yZSB0aGUgaW5jcmVtZW50IG9mIEIKICAgaW4gUEJFRk9SRV9T UCwgYW5kIHRoZSB1c2Ugb2YgQSBpbiBQTk9fU1AuICBUaGUgaGlnaGVyLWxl dmVsIGNhbGwgdGhhdAogICBwcm9jZXNzZXMgdGhlIFBMVVNfRVhQUiB3aWxs IG5lZWQgdG8gbWVyZ2UgdGhlIHR3byBsaXN0cyBzbyB0aGF0CiAgIGV2ZW50 dWFsbHksIGFsbCBhY2Nlc3NlcyBlbmQgdXAgb24gdGhlIHNhbWUgbGlzdCAo YW5kIHdlJ2xsIHdhcm4gYWJvdXQgdGhlCiAgIHVub3JkZXJlZCBzdWJleHBy ZXNzaW9ucyBiKysgYW5kIGIuCgogICBBIG5vdGUgb24gbWVyZ2luZy4gIElm IHdlIG1vZGlmeSB0aGUgZm9ybWVyIGV4YW1wbGUgc28gdGhhdCBvdXIgZXhw cmVzc2lvbgogICBiZWNvbWVzCiAgICAgKGIrKywgYikgKyBhCiAgIGNhcmUg bXVzdCBiZSB0YWtlbiBub3Qgc2ltcGx5IHRvIGFkZCBhbGwgdGhyZWUgZXhw cmVzc2lvbnMgaW50byB0aGUgZmluYWwKICAgUE5PX1NQIGxpc3QuICBUaGUg ZnVuY3Rpb24gbWVyZ2VfdGxpc3QgdGFrZXMgY2FyZSBvZiB0aGF0IGJ5IG1l cmdpbmcgdGhlCiAgIGJlZm9yZS1TUCBsaXN0IG9mIHRoZSBDT01QT1VORF9F WFBSIGludG8gaXRzIGFmdGVyLVNQIGxpc3QgaW4gYSBzcGVjaWFsCiAgIHdh eSwgc28gdGhhdCBubyBtb3JlIHRoYW4gb25lIGFjY2VzcyB0byBCIGlzIHJl Y29yZGVkLiAgKi8KCnN0YXRpYyB2b2lkCnZlcmlmeV90cmVlICh0cmVlIHgs IHN0cnVjdCB0bGlzdCAqKnBiZWZvcmVfc3AsIHN0cnVjdCB0bGlzdCAqKnBu b19zcCwKCSAgICAgdHJlZSB3cml0ZXIpCnsKICBzdHJ1Y3QgdGxpc3QgKnRt cF9iZWZvcmUsICp0bXBfbm9zcCwgKnRtcF9saXN0MiwgKnRtcF9saXN0MzsK ICBlbnVtIHRyZWVfY29kZSBjb2RlOwogIGVudW0gdHJlZV9jb2RlX2NsYXNz IGNsOwoKICAvKiBYIG1heSBiZSBOVUxMIGlmIGl0IGlzIHRoZSBvcGVyYW5k IG9mIGFuIGVtcHR5IHN0YXRlbWVudCBleHByZXNzaW9uCiAgICAgKHsgfSku ICAqLwogIGlmICh4ID09IE5VTEwpCiAgICByZXR1cm47CgogcmVzdGFydDoK ICBjb2RlID0gVFJFRV9DT0RFICh4KTsKICBjbCA9IFRSRUVfQ09ERV9DTEFT UyAoY29kZSk7CgogIGlmICh3YXJuaW5nX2NhbmRpZGF0ZV9wICh4KSkKICAg IHsKICAgICAgKnBub19zcCA9IG5ld190bGlzdCAoKnBub19zcCwgeCwgd3Jp dGVyKTsKICAgICAgcmV0dXJuOwogICAgfQoKICBzd2l0Y2ggKGNvZGUpCiAg ICB7CiAgICBjYXNlIENPTlNUUlVDVE9SOgogICAgICByZXR1cm47CgogICAg Y2FzZSBDT01QT1VORF9FWFBSOgogICAgY2FzZSBUUlVUSF9BTkRJRl9FWFBS OgogICAgY2FzZSBUUlVUSF9PUklGX0VYUFI6CiAgICAgIHRtcF9iZWZvcmUg PSB0bXBfbm9zcCA9IHRtcF9saXN0MyA9IDA7CiAgICAgIHZlcmlmeV90cmVl IChUUkVFX09QRVJBTkQgKHgsIDApLCAmdG1wX2JlZm9yZSwgJnRtcF9ub3Nw LCBOVUxMX1RSRUUpOwogICAgICB3YXJuX2Zvcl9jb2xsaXNpb25zICh0bXBf bm9zcCk7CiAgICAgIG1lcmdlX3RsaXN0IChwYmVmb3JlX3NwLCB0bXBfYmVm b3JlLCAwKTsKICAgICAgbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9u b3NwLCAwKTsKICAgICAgdmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwg MSksICZ0bXBfbGlzdDMsIHBub19zcCwgTlVMTF9UUkVFKTsKICAgICAgbWVy Z2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9saXN0MywgMCk7CiAgICAgIHJl dHVybjsKCiAgICBjYXNlIENPTkRfRVhQUjoKICAgICAgdG1wX2JlZm9yZSA9 IHRtcF9saXN0MiA9IDA7CiAgICAgIHZlcmlmeV90cmVlIChUUkVFX09QRVJB TkQgKHgsIDApLCAmdG1wX2JlZm9yZSwgJnRtcF9saXN0MiwgTlVMTF9UUkVF KTsKICAgICAgd2Fybl9mb3JfY29sbGlzaW9ucyAodG1wX2xpc3QyKTsKICAg ICAgbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9iZWZvcmUsIDApOwog ICAgICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1wX2xpc3QyLCAxKTsK CiAgICAgIHRtcF9saXN0MyA9IHRtcF9ub3NwID0gMDsKICAgICAgdmVyaWZ5 X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgMSksICZ0bXBfbGlzdDMsICZ0bXBf bm9zcCwgTlVMTF9UUkVFKTsKICAgICAgd2Fybl9mb3JfY29sbGlzaW9ucyAo dG1wX25vc3ApOwogICAgICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1w X2xpc3QzLCAwKTsKCiAgICAgIHRtcF9saXN0MyA9IHRtcF9saXN0MiA9IDA7 CiAgICAgIHZlcmlmeV90cmVlIChUUkVFX09QRVJBTkQgKHgsIDIpLCAmdG1w X2xpc3QzLCAmdG1wX2xpc3QyLCBOVUxMX1RSRUUpOwogICAgICB3YXJuX2Zv cl9jb2xsaXNpb25zICh0bXBfbGlzdDIpOwogICAgICBtZXJnZV90bGlzdCAo cGJlZm9yZV9zcCwgdG1wX2xpc3QzLCAwKTsKICAgICAgLyogUmF0aGVyIHRo YW4gYWRkIGJvdGggdG1wX25vc3AgYW5kIHRtcF9saXN0Miwgd2UgaGF2ZSB0 byBtZXJnZSB0aGUKCSB0d28gZmlyc3QsIHRvIGF2b2lkIHdhcm5pbmcgZm9y IChhID8gYisrIDogYisrKS4gICovCiAgICAgIG1lcmdlX3RsaXN0ICgmdG1w X25vc3AsIHRtcF9saXN0MiwgMCk7CiAgICAgIGFkZF90bGlzdCAocG5vX3Nw LCB0bXBfbm9zcCwgTlVMTF9UUkVFLCAwKTsKICAgICAgcmV0dXJuOwoKICAg IGNhc2UgUFJFREVDUkVNRU5UX0VYUFI6CiAgICBjYXNlIFBSRUlOQ1JFTUVO VF9FWFBSOgogICAgY2FzZSBQT1NUREVDUkVNRU5UX0VYUFI6CiAgICBjYXNl IFBPU1RJTkNSRU1FTlRfRVhQUjoKICAgICAgdmVyaWZ5X3RyZWUgKFRSRUVf T1BFUkFORCAoeCwgMCksIHBub19zcCwgcG5vX3NwLCB4KTsKICAgICAgcmV0 dXJuOwoKICAgIGNhc2UgTU9ESUZZX0VYUFI6CiAgICAgIHRtcF9iZWZvcmUg PSB0bXBfbm9zcCA9IHRtcF9saXN0MyA9IDA7CiAgICAgIHZlcmlmeV90cmVl IChUUkVFX09QRVJBTkQgKHgsIDEpLCAmdG1wX2JlZm9yZSwgJnRtcF9ub3Nw LCBOVUxMX1RSRUUpOwogICAgICB2ZXJpZnlfdHJlZSAoVFJFRV9PUEVSQU5E ICh4LCAwKSwgJnRtcF9saXN0MywgJnRtcF9saXN0MywgeCk7CiAgICAgIC8q IEV4cHJlc3Npb25zIGluc2lkZSB0aGUgTEhTIGFyZSBub3Qgb3JkZXJlZCB3 cnQuIHRoZSBzZXF1ZW5jZSBwb2ludHMKCSBpbiB0aGUgUkhTLiAgRXhhbXBs ZToKCSAgICphID0gKGErKywgMikKCSBEZXNwaXRlIHRoZSBmYWN0IHRoYXQg dGhlIG1vZGlmaWNhdGlvbiBvZiAiYSIgaXMgaW4gdGhlIGJlZm9yZV9zcAoJ IGxpc3QgKHRtcF9iZWZvcmUpLCBpdCBjb25mbGljdHMgd2l0aCB0aGUgdXNl IG9mICJhIiBpbiB0aGUgTEhTLgoJIFdlIGNhbiBoYW5kbGUgdGhpcyBieSBh ZGRpbmcgdGhlIGNvbnRlbnRzIG9mIHRtcF9saXN0MwoJIHRvIHRob3NlIG9m IHRtcF9iZWZvcmUsIGFuZCByZWRvaW5nIHRoZSBjb2xsaXNpb24gd2Fybmlu Z3MgZm9yIHRoYXQKCSBsaXN0LiAgKi8KICAgICAgYWRkX3RsaXN0ICgmdG1w X2JlZm9yZSwgdG1wX2xpc3QzLCB4LCAxKTsKICAgICAgd2Fybl9mb3JfY29s bGlzaW9ucyAodG1wX2JlZm9yZSk7CiAgICAgIC8qIEV4Y2x1ZGUgdGhlIExI UyBpdHNlbGYgaGVyZTsgd2UgZmlyc3QgaGF2ZSB0byBtZXJnZSBpdCBpbnRv IHRoZQoJIHRtcF9ub3NwIGxpc3QuICBUaGlzIGlzIGRvbmUgdG8gYXZvaWQg d2FybmluZyBmb3IgImEgPSBhIjsgaWYgd2UKCSBkaWRuJ3QgZXhjbHVkZSB0 aGUgTEhTLCB3ZSdkIGdldCBpdCB0d2ljZSwgb25jZSBhcyBhIHJlYWQgYW5k IG9uY2UKCSBhcyBhIHdyaXRlLiAgKi8KICAgICAgYWRkX3RsaXN0IChwbm9f c3AsIHRtcF9saXN0MywgeCwgMCk7CiAgICAgIHdhcm5fZm9yX2NvbGxpc2lv bnNfMSAoVFJFRV9PUEVSQU5EICh4LCAwKSwgeCwgdG1wX25vc3AsIDEpOwoK ICAgICAgbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9iZWZvcmUsIDAp OwogICAgICBpZiAod2FybmluZ19jYW5kaWRhdGVfcCAoVFJFRV9PUEVSQU5E ICh4LCAwKSkpCgltZXJnZV90bGlzdCAoJnRtcF9ub3NwLCBuZXdfdGxpc3Qg KE5VTEwsIFRSRUVfT1BFUkFORCAoeCwgMCksIHgpLCAwKTsKICAgICAgYWRk X3RsaXN0IChwbm9fc3AsIHRtcF9ub3NwLCBOVUxMX1RSRUUsIDEpOwogICAg ICByZXR1cm47CgogICAgY2FzZSBDQUxMX0VYUFI6CiAgICAgIC8qIFdlIG5l ZWQgdG8gd2FybiBhYm91dCBjb25mbGljdHMgYW1vbmcgYXJndW1lbnRzIGFu ZCBjb25mbGljdHMgYmV0d2VlbgoJIGFyZ3MgYW5kIHRoZSBmdW5jdGlvbiBh ZGRyZXNzLiAgU2lkZSBlZmZlY3RzIG9mIHRoZSBmdW5jdGlvbiBhZGRyZXNz LAoJIGhvd2V2ZXIsIGFyZSBub3Qgb3JkZXJlZCBieSB0aGUgc2VxdWVuY2Ug cG9pbnQgb2YgdGhlIGNhbGwuICAqLwogICAgICB7CgljYWxsX2V4cHJfYXJn X2l0ZXJhdG9yIGl0ZXI7Cgl0cmVlIGFyZzsKCXRtcF9iZWZvcmUgPSB0bXBf bm9zcCA9IDA7IAoJdmVyaWZ5X3RyZWUgKENBTExfRVhQUl9GTiAoeCksICZ0 bXBfYmVmb3JlLCAmdG1wX25vc3AsIE5VTExfVFJFRSk7CglGT1JfRUFDSF9D QUxMX0VYUFJfQVJHIChhcmcsIGl0ZXIsIHgpCgkgIHsKCSAgICB0bXBfbGlz dDIgPSB0bXBfbGlzdDMgPSAwOwoJICAgIHZlcmlmeV90cmVlIChhcmcsICZ0 bXBfbGlzdDIsICZ0bXBfbGlzdDMsIE5VTExfVFJFRSk7CgkgICAgbWVyZ2Vf dGxpc3QgKCZ0bXBfbGlzdDMsIHRtcF9saXN0MiwgMCk7CgkgICAgYWRkX3Rs aXN0ICgmdG1wX2JlZm9yZSwgdG1wX2xpc3QzLCBOVUxMX1RSRUUsIDApOwoJ ICB9CglhZGRfdGxpc3QgKCZ0bXBfYmVmb3JlLCB0bXBfbm9zcCwgTlVMTF9U UkVFLCAwKTsKCXdhcm5fZm9yX2NvbGxpc2lvbnMgKHRtcF9iZWZvcmUpOwoJ YWRkX3RsaXN0IChwYmVmb3JlX3NwLCB0bXBfYmVmb3JlLCBOVUxMX1RSRUUs IDApOwoJcmV0dXJuOwogICAgICB9CgogICAgY2FzZSBUUkVFX0xJU1Q6CiAg ICAgIC8qIFNjYW4gYWxsIHRoZSBsaXN0LCBlLmcuIGluZGljZXMgb2YgbXVs dGkgZGltZW5zaW9uYWwgYXJyYXkuICAqLwogICAgICB3aGlsZSAoeCkKCXsK CSAgdG1wX2JlZm9yZSA9IHRtcF9ub3NwID0gMDsKCSAgdmVyaWZ5X3RyZWUg KFRSRUVfVkFMVUUgKHgpLCAmdG1wX2JlZm9yZSwgJnRtcF9ub3NwLCBOVUxM X1RSRUUpOwoJICBtZXJnZV90bGlzdCAoJnRtcF9ub3NwLCB0bXBfYmVmb3Jl LCAwKTsKCSAgYWRkX3RsaXN0IChwbm9fc3AsIHRtcF9ub3NwLCBOVUxMX1RS RUUsIDApOwoJICB4ID0gVFJFRV9DSEFJTiAoeCk7Cgl9CiAgICAgIHJldHVy bjsKCiAgICBjYXNlIFNBVkVfRVhQUjoKICAgICAgewoJc3RydWN0IHRsaXN0 X2NhY2hlICp0OwoJZm9yICh0ID0gc2F2ZV9leHByX2NhY2hlOyB0OyB0ID0g dC0+bmV4dCkKCSAgaWYgKHQtPmV4cHIgPT0geCkKCSAgICBicmVhazsKCglp ZiAoIXQpCgkgIHsKCSAgICB0ID0gWE9CTkVXICgmdGxpc3Rfb2JzdGFjaywg c3RydWN0IHRsaXN0X2NhY2hlKTsKCSAgICB0LT5uZXh0ID0gc2F2ZV9leHBy X2NhY2hlOwoJICAgIHQtPmV4cHIgPSB4OwoJICAgIHNhdmVfZXhwcl9jYWNo ZSA9IHQ7CgoJICAgIHRtcF9iZWZvcmUgPSB0bXBfbm9zcCA9IDA7CgkgICAg dmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgMCksICZ0bXBfYmVmb3Jl LCAmdG1wX25vc3AsIE5VTExfVFJFRSk7CgkgICAgd2Fybl9mb3JfY29sbGlz aW9ucyAodG1wX25vc3ApOwoKCSAgICB0bXBfbGlzdDMgPSAwOwoJICAgIHdo aWxlICh0bXBfbm9zcCkKCSAgICAgIHsKCQlzdHJ1Y3QgdGxpc3QgKnQgPSB0 bXBfbm9zcDsKCQl0bXBfbm9zcCA9IHQtPm5leHQ7CgkJbWVyZ2VfdGxpc3Qg KCZ0bXBfbGlzdDMsIHQsIDApOwoJICAgICAgfQoJICAgIHQtPmNhY2hlX2Jl Zm9yZV9zcCA9IHRtcF9iZWZvcmU7CgkgICAgdC0+Y2FjaGVfYWZ0ZXJfc3Ag PSB0bXBfbGlzdDM7CgkgIH0KCW1lcmdlX3RsaXN0IChwYmVmb3JlX3NwLCB0 LT5jYWNoZV9iZWZvcmVfc3AsIDEpOwoJYWRkX3RsaXN0IChwbm9fc3AsIHQt PmNhY2hlX2FmdGVyX3NwLCBOVUxMX1RSRUUsIDEpOwoJcmV0dXJuOwogICAg ICB9CgogICAgZGVmYXVsdDoKICAgICAgLyogRm9yIG90aGVyIGV4cHJlc3Np b25zLCBzaW1wbHkgcmVjdXJzZSBvbiB0aGVpciBvcGVyYW5kcy4KCSBNYW51 YWwgdGFpbCByZWN1cnNpb24gZm9yIHVuYXJ5IGV4cHJlc3Npb25zLgoJIE90 aGVyIG5vbi1leHByZXNzaW9ucyBuZWVkIG5vdCBiZSBwcm9jZXNzZWQuICAq LwogICAgICBpZiAoY2wgPT0gdGNjX3VuYXJ5KQoJewoJICB4ID0gVFJFRV9P UEVSQU5EICh4LCAwKTsKCSAgd3JpdGVyID0gMDsKCSAgZ290byByZXN0YXJ0 OwoJfQogICAgICBlbHNlIGlmIChJU19FWFBSX0NPREVfQ0xBU1MgKGNsKSkK CXsKCSAgaW50IGxwOwoJICBpbnQgbWF4ID0gVFJFRV9PUEVSQU5EX0xFTkdU SCAoeCk7CgkgIGZvciAobHAgPSAwOyBscCA8IG1heDsgbHArKykKCSAgICB7 CgkgICAgICB0bXBfYmVmb3JlID0gdG1wX25vc3AgPSAwOwoJICAgICAgdmVy aWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgbHApLCAmdG1wX2JlZm9yZSwg JnRtcF9ub3NwLCAwKTsKCSAgICAgIG1lcmdlX3RsaXN0ICgmdG1wX25vc3As IHRtcF9iZWZvcmUsIDApOwoJICAgICAgYWRkX3RsaXN0IChwbm9fc3AsIHRt cF9ub3NwLCBOVUxMX1RSRUUsIDApOwoJICAgIH0KCX0KICAgICAgcmV0dXJu OwogICAgfQp9CgovKiBUcnkgdG8gd2FybiBmb3IgdW5kZWZpbmVkIGJlaGF2 aW9yIGluIEVYUFIgZHVlIHRvIG1pc3Npbmcgc2VxdWVuY2UKICAgcG9pbnRz LiAgKi8KCnZvaWQKdmVyaWZ5X3NlcXVlbmNlX3BvaW50cyAodHJlZSBleHBy KQp7CiAgc3RydWN0IHRsaXN0ICpiZWZvcmVfc3AgPSAwLCAqYWZ0ZXJfc3Ag PSAwOwoKICB3YXJuZWRfaWRzID0gMDsKICBzYXZlX2V4cHJfY2FjaGUgPSAw OwogIGlmICh0bGlzdF9maXJzdG9iaiA9PSAwKQogICAgewogICAgICBnY2Nf b2JzdGFja19pbml0ICgmdGxpc3Rfb2JzdGFjayk7CiAgICAgIHRsaXN0X2Zp cnN0b2JqID0gKGNoYXIgKikgb2JzdGFja19hbGxvYyAoJnRsaXN0X29ic3Rh Y2ssIDApOwogICAgfQoKICB2ZXJpZnlfdHJlZSAoZXhwciwgJmJlZm9yZV9z cCwgJmFmdGVyX3NwLCAwKTsKICB3YXJuX2Zvcl9jb2xsaXNpb25zIChhZnRl cl9zcCk7CiAgb2JzdGFja19mcmVlICgmdGxpc3Rfb2JzdGFjaywgdGxpc3Rf Zmlyc3RvYmopOwp9CgwKLyogVmFsaWRhdGUgdGhlIGV4cHJlc3Npb24gYWZ0 ZXIgYGNhc2UnIGFuZCBhcHBseSBkZWZhdWx0IHByb21vdGlvbnMuICAqLwoK c3RhdGljIHRyZWUKY2hlY2tfY2FzZV92YWx1ZSAodHJlZSB2YWx1ZSkKewog IGlmICh2YWx1ZSA9PSBOVUxMX1RSRUUpCiAgICByZXR1cm4gdmFsdWU7Cgog IC8qID8/PyBDYW4gd2UgZXZlciBnZXQgbm9wcyBoZXJlIGZvciBhIHZhbGlk IGNhc2UgdmFsdWU/ICBXZQogICAgIHNob3VsZG4ndCBmb3IgQy4gICovCiAg U1RSSVBfVFlQRV9OT1BTICh2YWx1ZSk7CiAgLyogSW4gQysrLCB0aGUgZm9s bG93aW5nIGlzIGFsbG93ZWQ6CgogICAgICAgY29uc3QgaW50IGkgPSAzOwog ICAgICAgc3dpdGNoICguLi4pIHsgY2FzZSBpOiAuLi4gfQoKICAgICBTbywg d2UgdHJ5IHRvIHJlZHVjZSB0aGUgVkFMVUUgdG8gYSBjb25zdGFudCB0aGF0 IHdheS4gICovCiAgaWYgKGNfZGlhbGVjdF9jeHggKCkpCiAgICB7CiAgICAg IHZhbHVlID0gZGVjbF9jb25zdGFudF92YWx1ZSAodmFsdWUpOwogICAgICBT VFJJUF9UWVBFX05PUFMgKHZhbHVlKTsKICAgICAgdmFsdWUgPSBmb2xkICh2 YWx1ZSk7CiAgICB9CgogIGlmIChUUkVFX0NPREUgKHZhbHVlKSA9PSBJTlRF R0VSX0NTVCkKICAgIC8qIFByb21vdGUgY2hhciBvciBzaG9ydCB0byBpbnQu ICAqLwogICAgdmFsdWUgPSBwZXJmb3JtX2ludGVncmFsX3Byb21vdGlvbnMg KHZhbHVlKTsKICBlbHNlIGlmICh2YWx1ZSAhPSBlcnJvcl9tYXJrX25vZGUp CiAgICB7CiAgICAgIGVycm9yICgiY2FzZSBsYWJlbCBkb2VzIG5vdCByZWR1 Y2UgdG8gYW4gaW50ZWdlciBjb25zdGFudCIpOwogICAgICB2YWx1ZSA9IGVy cm9yX21hcmtfbm9kZTsKICAgIH0KCiAgY29uc3RhbnRfZXhwcmVzc2lvbl93 YXJuaW5nICh2YWx1ZSk7CgogIHJldHVybiB2YWx1ZTsKfQoMCi8qIFNlZSBp ZiB0aGUgY2FzZSB2YWx1ZXMgTE9XIGFuZCBISUdIIGFyZSBpbiB0aGUgcmFu Z2Ugb2YgdGhlIG9yaWdpbmFsCiAgIHR5cGUgKGkuZS4gYmVmb3JlIHRoZSBk ZWZhdWx0IGNvbnZlcnNpb24gdG8gaW50KSBvZiB0aGUgc3dpdGNoIHRlc3Rp bmcKICAgZXhwcmVzc2lvbi4KICAgVFlQRSBpcyB0aGUgcHJvbW90ZWQgdHlw ZSBvZiB0aGUgdGVzdGluZyBleHByZXNzaW9uLCBhbmQgT1JJR19UWVBFIGlz CiAgIHRoZSB0eXBlIGJlZm9yZSBwcm9tb3RpbmcgaXQuICBDQVNFX0xPV19Q IGlzIGEgcG9pbnRlciB0byB0aGUgbG93ZXIKICAgYm91bmQgb2YgdGhlIGNh c2UgbGFiZWwsIGFuZCBDQVNFX0hJR0hfUCBpcyB0aGUgdXBwZXIgYm91bmQg b3IgTlVMTAogICBpZiB0aGUgY2FzZSBpcyBub3QgYSBjYXNlIHJhbmdlLgog ICBUaGUgY2FsbGVyIGhhcyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90 IGNhbGxlZCB3aXRoIE5VTEwgZm9yCiAgIENBU0VfTE9XX1AgKGkuZS4gdGhl IGRlZmF1bHQgY2FzZSkuCiAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FzZSBs YWJlbCBpcyBpbiByYW5nZSBvZiBPUklHX1RZUEUgKHNhdHVyYXRlZCBvcgog ICB1bnRvdWNoZWQpIG9yIGZhbHNlIGlmIHRoZSBsYWJlbCBpcyBvdXQgb2Yg cmFuZ2UuICAqLwoKc3RhdGljIGJvb2wKY2hlY2tfY2FzZV9ib3VuZHMgKHRy ZWUgdHlwZSwgdHJlZSBvcmlnX3R5cGUsCgkJICAgdHJlZSAqY2FzZV9sb3df cCwgdHJlZSAqY2FzZV9oaWdoX3ApCnsKICB0cmVlIG1pbl92YWx1ZSwgbWF4 X3ZhbHVlOwogIHRyZWUgY2FzZV9sb3cgPSAqY2FzZV9sb3dfcDsKICB0cmVl IGNhc2VfaGlnaCA9IGNhc2VfaGlnaF9wID8gKmNhc2VfaGlnaF9wIDogY2Fz ZV9sb3c7CgogIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUg b3JpZ2luYWwgdHlwZSwgZG8gbm90aGluZy4gICovCiAgaWYgKG9yaWdfdHlw ZSA9PSBlcnJvcl9tYXJrX25vZGUpCiAgICByZXR1cm4gdHJ1ZTsKCiAgbWlu X3ZhbHVlID0gVFlQRV9NSU5fVkFMVUUgKG9yaWdfdHlwZSk7CiAgbWF4X3Zh bHVlID0gVFlQRV9NQVhfVkFMVUUgKG9yaWdfdHlwZSk7CgogIC8qIENhc2Ug bGFiZWwgaXMgbGVzcyB0aGFuIG1pbmltdW0gZm9yIHR5cGUuICAqLwogIGlm ICh0cmVlX2ludF9jc3RfY29tcGFyZSAoY2FzZV9sb3csIG1pbl92YWx1ZSkg PCAwCiAgICAgICYmIHRyZWVfaW50X2NzdF9jb21wYXJlIChjYXNlX2hpZ2gs IG1pbl92YWx1ZSkgPCAwKQogICAgewogICAgICB3YXJuaW5nICgwLCAiY2Fz ZSBsYWJlbCB2YWx1ZSBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBmb3Ig dHlwZSIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogIC8qIENhc2Ug dmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0gZm9yIHR5cGUuICAqLwog IGlmICh0cmVlX2ludF9jc3RfY29tcGFyZSAoY2FzZV9sb3csIG1heF92YWx1 ZSkgPiAwCiAgICAgICYmIHRyZWVfaW50X2NzdF9jb21wYXJlIChjYXNlX2hp Z2gsIG1heF92YWx1ZSkgPiAwKQogICAgewogICAgICB3YXJuaW5nICgwLCAi Y2FzZSBsYWJlbCB2YWx1ZSBleGNlZWRzIG1heGltdW0gdmFsdWUgZm9yIHR5 cGUiKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAvKiBTYXR1cmF0 ZSBsb3dlciBjYXNlIGxhYmVsIHZhbHVlIHRvIG1pbmltdW0uICAqLwogIGlm ICh0cmVlX2ludF9jc3RfY29tcGFyZSAoY2FzZV9oaWdoLCBtaW5fdmFsdWUp ID49IDAKICAgICAgJiYgdHJlZV9pbnRfY3N0X2NvbXBhcmUgKGNhc2VfbG93 LCBtaW5fdmFsdWUpIDwgMCkKICAgIHsKICAgICAgd2FybmluZyAoMCwgImxv d2VyIHZhbHVlIGluIGNhc2UgbGFiZWwgcmFuZ2UiCgkgICAgICAgIiBsZXNz IHRoYW4gbWluaW11bSB2YWx1ZSBmb3IgdHlwZSIpOwogICAgICBjYXNlX2xv dyA9IG1pbl92YWx1ZTsKICAgIH0KCiAgLyogU2F0dXJhdGUgdXBwZXIgY2Fz ZSBsYWJlbCB2YWx1ZSB0byBtYXhpbXVtLiAgKi8KICBpZiAodHJlZV9pbnRf Y3N0X2NvbXBhcmUgKGNhc2VfbG93LCBtYXhfdmFsdWUpIDw9IDAKICAgICAg JiYgdHJlZV9pbnRfY3N0X2NvbXBhcmUgKGNhc2VfaGlnaCwgbWF4X3ZhbHVl KSA+IDApCiAgICB7CiAgICAgIHdhcm5pbmcgKDAsICJ1cHBlciB2YWx1ZSBp biBjYXNlIGxhYmVsIHJhbmdlIgoJICAgICAgICIgZXhjZWVkcyBtYXhpbXVt IHZhbHVlIGZvciB0eXBlIik7CiAgICAgIGNhc2VfaGlnaCA9IG1heF92YWx1 ZTsKICAgIH0KCiAgaWYgKCpjYXNlX2xvd19wICE9IGNhc2VfbG93KQogICAg KmNhc2VfbG93X3AgPSBjb252ZXJ0ICh0eXBlLCBjYXNlX2xvdyk7CiAgaWYg KGNhc2VfaGlnaF9wICYmICpjYXNlX2hpZ2hfcCAhPSBjYXNlX2hpZ2gpCiAg ICAqY2FzZV9oaWdoX3AgPSBjb252ZXJ0ICh0eXBlLCBjYXNlX2hpZ2gpOwoK ICByZXR1cm4gdHJ1ZTsKfQoMCi8qIFJldHVybiBhbiBpbnRlZ2VyIHR5cGUg d2l0aCBCSVRTIGJpdHMgb2YgcHJlY2lzaW9uLAogICB0aGF0IGlzIHVuc2ln bmVkIGlmIFVOU0lHTkVEUCBpcyBub256ZXJvLCBvdGhlcndpc2Ugc2lnbmVk LiAgKi8KCnRyZWUKY19jb21tb25fdHlwZV9mb3Jfc2l6ZSAodW5zaWduZWQg aW50IGJpdHMsIGludCB1bnNpZ25lZHApCnsKICBpZiAoYml0cyA9PSBUWVBF X1BSRUNJU0lPTiAoaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVu c2lnbmVkcCA/IHVuc2lnbmVkX3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9u b2RlOwoKICBpZiAoYml0cyA9PSBUWVBFX1BSRUNJU0lPTiAoc2lnbmVkX2No YXJfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25l ZF9jaGFyX3R5cGVfbm9kZSA6IHNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKCiAg aWYgKGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKHNob3J0X2ludGVnZXJfdHlw ZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyBzaG9ydF91bnNpZ25l ZF90eXBlX25vZGUgOiBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYg KGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKGxvbmdfaW50ZWdlcl90eXBlX25v ZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfdW5zaWduZWRfdHlw ZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYgKGJpdHMg PT0gVFlQRV9QUkVDSVNJT04gKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9k ZSkpCiAgICByZXR1cm4gKHVuc2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25l ZF90eXBlX25vZGUKCSAgICA6IGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9k ZSk7CgogIGlmIChiaXRzID09IFRZUEVfUFJFQ0lTSU9OICh3aWRlc3RfaW50 ZWdlcl9saXRlcmFsX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gKHVuc2lnbmVk cCA/IHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVfbm9kZQoJICAgIDog d2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlX25vZGUpOwoKICBpZiAoYml0 cyA8PSBUWVBFX1BSRUNJU0lPTiAoaW50UUlfdHlwZV9ub2RlKSkKICAgIHJl dHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRRSV90eXBlX25vZGUgOiBp bnRRSV90eXBlX25vZGU7CgogIGlmIChiaXRzIDw9IFRZUEVfUFJFQ0lTSU9O IChpbnRISV90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVu c2lnbmVkX2ludEhJX3R5cGVfbm9kZSA6IGludEhJX3R5cGVfbm9kZTsKCiAg aWYgKGJpdHMgPD0gVFlQRV9QUkVDSVNJT04gKGludFNJX3R5cGVfbm9kZSkp CiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50U0lfdHlwZV9u b2RlIDogaW50U0lfdHlwZV9ub2RlOwoKICBpZiAoYml0cyA8PSBUWVBFX1BS RUNJU0lPTiAoaW50RElfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25l ZHAgPyB1bnNpZ25lZF9pbnRESV90eXBlX25vZGUgOiBpbnRESV90eXBlX25v ZGU7CgogIHJldHVybiAwOwp9CgovKiBSZXR1cm4gYSBmaXhlZC1wb2ludCB0 eXBlIHRoYXQgaGFzIGF0IGxlYXN0IElCSVQgaWJpdHMgYW5kIEZCSVQgZmJp dHMKICAgdGhhdCBpcyB1bnNpZ25lZCBpZiBVTlNJR05FRFAgaXMgbm9uemVy bywgb3RoZXJ3aXNlIHNpZ25lZDsKICAgYW5kIHNhdHVyYXRpbmcgaWYgU0FU UCBpcyBub256ZXJvLCBvdGhlcndpc2Ugbm90IHNhdHVyYXRpbmcuICAqLwoK dHJlZQpjX2NvbW1vbl9maXhlZF9wb2ludF90eXBlX2Zvcl9zaXplICh1bnNp Z25lZCBpbnQgaWJpdCwgdW5zaWduZWQgaW50IGZiaXQsCgkJCQkgICAgaW50 IHVuc2lnbmVkcCwgaW50IHNhdHApCnsKICBlbnVtIG1hY2hpbmVfbW9kZSBt b2RlOwogIGlmIChpYml0ID09IDApCiAgICBtb2RlID0gdW5zaWduZWRwID8g VVFRbW9kZSA6IFFRbW9kZTsKICBlbHNlCiAgICBtb2RlID0gdW5zaWduZWRw ID8gVUhBbW9kZSA6IEhBbW9kZTsKCiAgZm9yICg7IG1vZGUgIT0gVk9JRG1v ZGU7IG1vZGUgPSBHRVRfTU9ERV9XSURFUl9NT0RFIChtb2RlKSkKICAgIGlm IChHRVRfTU9ERV9JQklUIChtb2RlKSA+PSBpYml0ICYmIEdFVF9NT0RFX0ZC SVQgKG1vZGUpID49IGZiaXQpCiAgICAgIGJyZWFrOwoKICBpZiAobW9kZSA9 PSBWT0lEbW9kZSB8fCAhdGFyZ2V0bS5zY2FsYXJfbW9kZV9zdXBwb3J0ZWRf cCAobW9kZSkpCiAgICB7CiAgICAgIHNvcnJ5ICgiR0NDIGNhbm5vdCBzdXBw b3J0IG9wZXJhdG9ycyB3aXRoIGludGVnZXIgdHlwZXMgYW5kICIKCSAgICAg ImZpeGVkLXBvaW50IHR5cGVzIHRoYXQgaGF2ZSB0b28gbWFueSBpbnRlZ3Jh bCBhbmQgIgoJICAgICAiZnJhY3Rpb25hbCBiaXRzIHRvZ2V0aGVyIik7CiAg ICAgIHJldHVybiAwOwogICAgfQoKICByZXR1cm4gY19jb21tb25fdHlwZV9m b3JfbW9kZSAobW9kZSwgc2F0cCk7Cn0KCi8qIFVzZWQgZm9yIGNvbW11bmlj YXRpb24gYmV0d2VlbiBjX2NvbW1vbl90eXBlX2Zvcl9tb2RlIGFuZAogICBj X3JlZ2lzdGVyX2J1aWx0aW5fdHlwZS4gICovCnN0YXRpYyBHVFkoKCkpIHRy ZWUgcmVnaXN0ZXJlZF9idWlsdGluX3R5cGVzOwoKLyogUmV0dXJuIGEgZGF0 YSB0eXBlIHRoYXQgaGFzIG1hY2hpbmUgbW9kZSBNT0RFLgogICBJZiB0aGUg bW9kZSBpcyBhbiBpbnRlZ2VyLAogICB0aGVuIFVOU0lHTkVEUCBzZWxlY3Rz IGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCB0eXBlcy4KICAgSWYgdGhl IG1vZGUgaXMgYSBmaXhlZC1wb2ludCBtb2RlLAogICB0aGVuIFVOU0lHTkVE UCBzZWxlY3RzIGJldHdlZW4gc2F0dXJhdGluZyBhbmQgbm9uc2F0dXJhdGlu ZyB0eXBlcy4gICovCgp0cmVlCmNfY29tbW9uX3R5cGVfZm9yX21vZGUgKGVu dW0gbWFjaGluZV9tb2RlIG1vZGUsIGludCB1bnNpZ25lZHApCnsKICB0cmVl IHQ7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoaW50ZWdlcl90eXBlX25v ZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX3R5cGVfbm9k ZSA6IGludGVnZXJfdHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBUWVBFX01P REUgKHNpZ25lZF9jaGFyX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWdu ZWRwID8gdW5zaWduZWRfY2hhcl90eXBlX25vZGUgOiBzaWduZWRfY2hhcl90 eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoc2hvcnRfaW50 ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHNob3J0 X3Vuc2lnbmVkX3R5cGVfbm9kZSA6IHNob3J0X2ludGVnZXJfdHlwZV9ub2Rl OwoKICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGxvbmdfaW50ZWdlcl90eXBl X25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfdW5zaWduZWRf dHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFIChsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGUp KQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25lZF90 eXBlX25vZGUgOiBsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGU7CgogIGlm IChtb2RlID09IFRZUEVfTU9ERSAod2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90 eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHdpZGVzdF91bnNp Z25lZF9saXRlcmFsX3R5cGVfbm9kZQoJCSAgICAgOiB3aWRlc3RfaW50ZWdl cl9saXRlcmFsX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gUUltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFFJX3R5cGVfbm9k ZSA6IGludFFJX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gSEltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludEhJX3R5cGVfbm9k ZSA6IGludEhJX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gU0ltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFNJX3R5cGVfbm9k ZSA6IGludFNJX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gREltb2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludERJX3R5cGVfbm9k ZSA6IGludERJX3R5cGVfbm9kZTsKCiNpZiBIT1NUX0JJVFNfUEVSX1dJREVf SU5UID49IDY0CiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChpbnRUSV90eXBl X25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFRJ X3R5cGVfbm9kZSA6IGludFRJX3R5cGVfbm9kZTsKI2VuZGlmCgogIGlmICht b2RlID09IFRZUEVfTU9ERSAoZmxvYXRfdHlwZV9ub2RlKSkKICAgIHJldHVy biBmbG9hdF90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAo ZG91YmxlX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gZG91YmxlX3R5cGVfbm9k ZTsKCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChsb25nX2RvdWJsZV90eXBl X25vZGUpKQogICAgcmV0dXJuIGxvbmdfZG91YmxlX3R5cGVfbm9kZTsKCiAg aWYgKG1vZGUgPT0gVFlQRV9NT0RFICh2b2lkX3R5cGVfbm9kZSkpCiAgICBy ZXR1cm4gdm9pZF90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9E RSAoYnVpbGRfcG9pbnRlcl90eXBlIChjaGFyX3R5cGVfbm9kZSkpKQogICAg cmV0dXJuICh1bnNpZ25lZHAKCSAgICA/IG1ha2VfdW5zaWduZWRfdHlwZSAo R0VUX01PREVfUFJFQ0lTSU9OIChtb2RlKSkKCSAgICA6IG1ha2Vfc2lnbmVk X3R5cGUgKEdFVF9NT0RFX1BSRUNJU0lPTiAobW9kZSkpKTsKCiAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFIChidWlsZF9wb2ludGVyX3R5cGUgKGludGVnZXJf dHlwZV9ub2RlKSkpCiAgICByZXR1cm4gKHVuc2lnbmVkcAoJICAgID8gbWFr ZV91bnNpZ25lZF90eXBlIChHRVRfTU9ERV9QUkVDSVNJT04gKG1vZGUpKQoJ ICAgIDogbWFrZV9zaWduZWRfdHlwZSAoR0VUX01PREVfUFJFQ0lTSU9OICht b2RlKSkpOwoKICBpZiAoQ09NUExFWF9NT0RFX1AgKG1vZGUpKQogICAgewog ICAgICBlbnVtIG1hY2hpbmVfbW9kZSBpbm5lcl9tb2RlOwogICAgICB0cmVl IGlubmVyX3R5cGU7CgogICAgICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGNv bXBsZXhfZmxvYXRfdHlwZV9ub2RlKSkKCXJldHVybiBjb21wbGV4X2Zsb2F0 X3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChjb21w bGV4X2RvdWJsZV90eXBlX25vZGUpKQoJcmV0dXJuIGNvbXBsZXhfZG91Ymxl X3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChjb21w bGV4X2xvbmdfZG91YmxlX3R5cGVfbm9kZSkpCglyZXR1cm4gY29tcGxleF9s b25nX2RvdWJsZV90eXBlX25vZGU7CgogICAgICBpZiAobW9kZSA9PSBUWVBF X01PREUgKGNvbXBsZXhfaW50ZWdlcl90eXBlX25vZGUpICYmICF1bnNpZ25l ZHApCglyZXR1cm4gY29tcGxleF9pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgICAg IGlubmVyX21vZGUgPSBHRVRfTU9ERV9JTk5FUiAobW9kZSk7CiAgICAgIGlu bmVyX3R5cGUgPSBjX2NvbW1vbl90eXBlX2Zvcl9tb2RlIChpbm5lcl9tb2Rl LCB1bnNpZ25lZHApOwogICAgICBpZiAoaW5uZXJfdHlwZSAhPSBOVUxMX1RS RUUpCglyZXR1cm4gYnVpbGRfY29tcGxleF90eXBlIChpbm5lcl90eXBlKTsK ICAgIH0KICBlbHNlIGlmIChWRUNUT1JfTU9ERV9QIChtb2RlKSkKICAgIHsK ICAgICAgZW51bSBtYWNoaW5lX21vZGUgaW5uZXJfbW9kZSA9IEdFVF9NT0RF X0lOTkVSIChtb2RlKTsKICAgICAgdHJlZSBpbm5lcl90eXBlID0gY19jb21t b25fdHlwZV9mb3JfbW9kZSAoaW5uZXJfbW9kZSwgdW5zaWduZWRwKTsKICAg ICAgaWYgKGlubmVyX3R5cGUgIT0gTlVMTF9UUkVFKQoJcmV0dXJuIGJ1aWxk X3ZlY3Rvcl90eXBlX2Zvcl9tb2RlIChpbm5lcl90eXBlLCBtb2RlKTsKICAg IH0KCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChkZmxvYXQzMl90eXBlX25v ZGUpKQogICAgcmV0dXJuIGRmbG9hdDMyX3R5cGVfbm9kZTsKICBpZiAobW9k ZSA9PSBUWVBFX01PREUgKGRmbG9hdDY0X3R5cGVfbm9kZSkpCiAgICByZXR1 cm4gZGZsb2F0NjRfdHlwZV9ub2RlOwogIGlmIChtb2RlID09IFRZUEVfTU9E RSAoZGZsb2F0MTI4X3R5cGVfbm9kZSkpCiAgICByZXR1cm4gZGZsb2F0MTI4 X3R5cGVfbm9kZTsKCiAgaWYgKEFMTF9TQ0FMQVJfRklYRURfUE9JTlRfTU9E RV9QIChtb2RlKSkKICAgIHsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RF IChzaG9ydF9mcmFjdF90eXBlX25vZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/ IHNhdF9zaG9ydF9mcmFjdF90eXBlX25vZGUgOiBzaG9ydF9mcmFjdF90eXBl X25vZGU7CiAgICAgIGlmIChtb2RlID09IFRZUEVfTU9ERSAoZnJhY3RfdHlw ZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfZnJhY3RfdHlwZV9u b2RlIDogZnJhY3RfdHlwZV9ub2RlOwogICAgICBpZiAobW9kZSA9PSBUWVBF X01PREUgKGxvbmdfZnJhY3RfdHlwZV9ub2RlKSkKCXJldHVybiB1bnNpZ25l ZHAgPyBzYXRfbG9uZ19mcmFjdF90eXBlX25vZGUgOiBsb25nX2ZyYWN0X3R5 cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChsb25nX2xv bmdfZnJhY3RfdHlwZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRf bG9uZ19sb25nX2ZyYWN0X3R5cGVfbm9kZQoJCQkgOiBsb25nX2xvbmdfZnJh Y3RfdHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFICh1 bnNpZ25lZF9zaG9ydF9mcmFjdF90eXBlX25vZGUpKQoJcmV0dXJuIHVuc2ln bmVkcCA/IHNhdF91bnNpZ25lZF9zaG9ydF9mcmFjdF90eXBlX25vZGUKCQkJ IDogdW5zaWduZWRfc2hvcnRfZnJhY3RfdHlwZV9ub2RlOwogICAgICBpZiAo bW9kZSA9PSBUWVBFX01PREUgKHVuc2lnbmVkX2ZyYWN0X3R5cGVfbm9kZSkp CglyZXR1cm4gdW5zaWduZWRwID8gc2F0X3Vuc2lnbmVkX2ZyYWN0X3R5cGVf bm9kZQoJCQkgOiB1bnNpZ25lZF9mcmFjdF90eXBlX25vZGU7CiAgICAgIGlm IChtb2RlID09IFRZUEVfTU9ERSAodW5zaWduZWRfbG9uZ19mcmFjdF90eXBl X25vZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF91bnNpZ25lZF9sb25n X2ZyYWN0X3R5cGVfbm9kZQoJCQkgOiB1bnNpZ25lZF9sb25nX2ZyYWN0X3R5 cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFICh1bnNpZ25l ZF9sb25nX2xvbmdfZnJhY3RfdHlwZV9ub2RlKSkKCXJldHVybiB1bnNpZ25l ZHAgPyBzYXRfdW5zaWduZWRfbG9uZ19sb25nX2ZyYWN0X3R5cGVfbm9kZQoJ CQkgOiB1bnNpZ25lZF9sb25nX2xvbmdfZnJhY3RfdHlwZV9ub2RlOwoKICAg ICAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChzaG9ydF9hY2N1bV90eXBlX25v ZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9zaG9ydF9hY2N1bV90eXBl X25vZGUgOiBzaG9ydF9hY2N1bV90eXBlX25vZGU7CiAgICAgIGlmIChtb2Rl ID09IFRZUEVfTU9ERSAoYWNjdW1fdHlwZV9ub2RlKSkKCXJldHVybiB1bnNp Z25lZHAgPyBzYXRfYWNjdW1fdHlwZV9ub2RlIDogYWNjdW1fdHlwZV9ub2Rl OwogICAgICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGxvbmdfYWNjdW1fdHlw ZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfbG9uZ19hY2N1bV90 eXBlX25vZGUgOiBsb25nX2FjY3VtX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFIChsb25nX2xvbmdfYWNjdW1fdHlwZV9ub2RlKSkK CXJldHVybiB1bnNpZ25lZHAgPyBzYXRfbG9uZ19sb25nX2FjY3VtX3R5cGVf bm9kZQoJCQkgOiBsb25nX2xvbmdfYWNjdW1fdHlwZV9ub2RlOwoKICAgICAg aWYgKG1vZGUgPT0gVFlQRV9NT0RFICh1bnNpZ25lZF9zaG9ydF9hY2N1bV90 eXBlX25vZGUpKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF91bnNpZ25lZF9z aG9ydF9hY2N1bV90eXBlX25vZGUKCQkJIDogdW5zaWduZWRfc2hvcnRfYWNj dW1fdHlwZV9ub2RlOwogICAgICBpZiAobW9kZSA9PSBUWVBFX01PREUgKHVu c2lnbmVkX2FjY3VtX3R5cGVfbm9kZSkpCglyZXR1cm4gdW5zaWduZWRwID8g c2F0X3Vuc2lnbmVkX2FjY3VtX3R5cGVfbm9kZQoJCQkgOiB1bnNpZ25lZF9h Y2N1bV90eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IFRZUEVfTU9ERSAo dW5zaWduZWRfbG9uZ19hY2N1bV90eXBlX25vZGUpKQoJcmV0dXJuIHVuc2ln bmVkcCA/IHNhdF91bnNpZ25lZF9sb25nX2FjY3VtX3R5cGVfbm9kZQoJCQkg OiB1bnNpZ25lZF9sb25nX2FjY3VtX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gVFlQRV9NT0RFICh1bnNpZ25lZF9sb25nX2xvbmdfYWNjdW1fdHlw ZV9ub2RlKSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfdW5zaWduZWRfbG9u Z19sb25nX2FjY3VtX3R5cGVfbm9kZQoJCQkgOiB1bnNpZ25lZF9sb25nX2xv bmdfYWNjdW1fdHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gUVFtb2Rl KQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9xcV90eXBlX25vZGUgOiBxcV90 eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IEhRbW9kZSkKCXJldHVybiB1 bnNpZ25lZHAgPyBzYXRfaHFfdHlwZV9ub2RlIDogaHFfdHlwZV9ub2RlOwog ICAgICBpZiAobW9kZSA9PSBTUW1vZGUpCglyZXR1cm4gdW5zaWduZWRwID8g c2F0X3NxX3R5cGVfbm9kZSA6IHNxX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gRFFtb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9kcV90eXBl X25vZGUgOiBkcV90eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IFRRbW9k ZSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfdHFfdHlwZV9ub2RlIDogdHFf dHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gVVFRbW9kZSkKCXJldHVy biB1bnNpZ25lZHAgPyBzYXRfdXFxX3R5cGVfbm9kZSA6IHVxcV90eXBlX25v ZGU7CiAgICAgIGlmIChtb2RlID09IFVIUW1vZGUpCglyZXR1cm4gdW5zaWdu ZWRwID8gc2F0X3VocV90eXBlX25vZGUgOiB1aHFfdHlwZV9ub2RlOwogICAg ICBpZiAobW9kZSA9PSBVU1Ftb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNh dF91c3FfdHlwZV9ub2RlIDogdXNxX3R5cGVfbm9kZTsKICAgICAgaWYgKG1v ZGUgPT0gVURRbW9kZSkKCXJldHVybiB1bnNpZ25lZHAgPyBzYXRfdWRxX3R5 cGVfbm9kZSA6IHVkcV90eXBlX25vZGU7CiAgICAgIGlmIChtb2RlID09IFVU UW1vZGUpCglyZXR1cm4gdW5zaWduZWRwID8gc2F0X3V0cV90eXBlX25vZGUg OiB1dHFfdHlwZV9ub2RlOwoKICAgICAgaWYgKG1vZGUgPT0gSEFtb2RlKQoJ cmV0dXJuIHVuc2lnbmVkcCA/IHNhdF9oYV90eXBlX25vZGUgOiBoYV90eXBl X25vZGU7CiAgICAgIGlmIChtb2RlID09IFNBbW9kZSkKCXJldHVybiB1bnNp Z25lZHAgPyBzYXRfc2FfdHlwZV9ub2RlIDogc2FfdHlwZV9ub2RlOwogICAg ICBpZiAobW9kZSA9PSBEQW1vZGUpCglyZXR1cm4gdW5zaWduZWRwID8gc2F0 X2RhX3R5cGVfbm9kZSA6IGRhX3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUg PT0gVEFtb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF90YV90eXBlX25v ZGUgOiB0YV90eXBlX25vZGU7CgogICAgICBpZiAobW9kZSA9PSBVSEFtb2Rl KQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNhdF91aGFfdHlwZV9ub2RlIDogdWhh X3R5cGVfbm9kZTsKICAgICAgaWYgKG1vZGUgPT0gVVNBbW9kZSkKCXJldHVy biB1bnNpZ25lZHAgPyBzYXRfdXNhX3R5cGVfbm9kZSA6IHVzYV90eXBlX25v ZGU7CiAgICAgIGlmIChtb2RlID09IFVEQW1vZGUpCglyZXR1cm4gdW5zaWdu ZWRwID8gc2F0X3VkYV90eXBlX25vZGUgOiB1ZGFfdHlwZV9ub2RlOwogICAg ICBpZiAobW9kZSA9PSBVVEFtb2RlKQoJcmV0dXJuIHVuc2lnbmVkcCA/IHNh dF91dGFfdHlwZV9ub2RlIDogdXRhX3R5cGVfbm9kZTsKICAgIH0KCiAgZm9y ICh0ID0gcmVnaXN0ZXJlZF9idWlsdGluX3R5cGVzOyB0OyB0ID0gVFJFRV9D SEFJTiAodCkpCiAgICBpZiAoVFlQRV9NT0RFIChUUkVFX1ZBTFVFICh0KSkg PT0gbW9kZSkKICAgICAgcmV0dXJuIFRSRUVfVkFMVUUgKHQpOwoKICByZXR1 cm4gMDsKfQoKdHJlZQpjX2NvbW1vbl91bnNpZ25lZF90eXBlICh0cmVlIHR5 cGUpCnsKICByZXR1cm4gY19jb21tb25fc2lnbmVkX29yX3Vuc2lnbmVkX3R5 cGUgKDEsIHR5cGUpOwp9CgovKiBSZXR1cm4gYSBzaWduZWQgdHlwZSB0aGUg c2FtZSBhcyBUWVBFIGluIG90aGVyIHJlc3BlY3RzLiAgKi8KCnRyZWUKY19j b21tb25fc2lnbmVkX3R5cGUgKHRyZWUgdHlwZSkKewogIHJldHVybiBjX2Nv bW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAoMCwgdHlwZSk7Cn0KCi8q IFJldHVybiBhIHR5cGUgdGhlIHNhbWUgYXMgVFlQRSBleGNlcHQgdW5zaWdu ZWQgb3IKICAgc2lnbmVkIGFjY29yZGluZyB0byBVTlNJR05FRFAuICAqLwoK dHJlZQpjX2NvbW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAoaW50IHVu c2lnbmVkcCwgdHJlZSB0eXBlKQp7CiAgdHJlZSB0eXBlMTsKCiAgLyogVGhp cyBibG9jayBvZiBjb2RlIGVtdWxhdGVzIHRoZSBiZWhhdmlvciBvZiB0aGUg b2xkCiAgICAgY19jb21tb25fdW5zaWduZWRfdHlwZS4gSW4gcGFydGljdWxh ciwgaXQgcmV0dXJucwogICAgIGxvbmdfdW5zaWduZWRfdHlwZV9ub2RlIGlm IHBhc3NlZCBhIGxvbmcsIGV2ZW4gd2hlbiBhIGludCB3b3VsZAogICAgIGhh dmUgdGhlIHNhbWUgc2l6ZS4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHdhcm5p bmdzIHRvIHdvcmsKICAgICBjb3JyZWN0bHkgaW4gYXJjaHMgd2hlcmUgc2l6 ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpICovCgogIHR5cGUxID0gVFlQRV9N QUlOX1ZBUklBTlQgKHR5cGUpOwogIGlmICh0eXBlMSA9PSBzaWduZWRfY2hh cl90eXBlX25vZGUgfHwgdHlwZTEgPT0gY2hhcl90eXBlX25vZGUgfHwgdHlw ZTEgPT0gdW5zaWduZWRfY2hhcl90eXBlX25vZGUpCiAgICByZXR1cm4gdW5z aWduZWRwID8gdW5zaWduZWRfY2hhcl90eXBlX25vZGUgOiBzaWduZWRfY2hh cl90eXBlX25vZGU7CiAgaWYgKHR5cGUxID09IGludGVnZXJfdHlwZV9ub2Rl IHx8IHR5cGUxID09IHVuc2lnbmVkX3R5cGVfbm9kZSkKICAgIHJldHVybiB1 bnNpZ25lZHAgPyB1bnNpZ25lZF90eXBlX25vZGUgOiBpbnRlZ2VyX3R5cGVf bm9kZTsKICBpZiAodHlwZTEgPT0gc2hvcnRfaW50ZWdlcl90eXBlX25vZGUg fHwgdHlwZTEgPT0gc2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlKQogICAgcmV0 dXJuIHVuc2lnbmVkcCA/IHNob3J0X3Vuc2lnbmVkX3R5cGVfbm9kZSA6IHNo b3J0X2ludGVnZXJfdHlwZV9ub2RlOwogIGlmICh0eXBlMSA9PSBsb25nX2lu dGVnZXJfdHlwZV9ub2RlIHx8IHR5cGUxID09IGxvbmdfdW5zaWduZWRfdHlw ZV9ub2RlKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfdW5zaWduZWRf dHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAodHlw ZTEgPT0gbG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlIHx8IHR5cGUxID09 IGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUpCiAgICByZXR1cm4gdW5z aWduZWRwID8gbG9uZ19sb25nX3Vuc2lnbmVkX3R5cGVfbm9kZSA6IGxvbmdf bG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0gd2lkZXN0 X2ludGVnZXJfbGl0ZXJhbF90eXBlX25vZGUgfHwgdHlwZTEgPT0gd2lkZXN0 X3Vuc2lnbmVkX2xpdGVyYWxfdHlwZV9ub2RlKQogICAgcmV0dXJuIHVuc2ln bmVkcCA/IHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVfbm9kZSA6IHdp ZGVzdF9pbnRlZ2VyX2xpdGVyYWxfdHlwZV9ub2RlOwojaWYgSE9TVF9CSVRT X1BFUl9XSURFX0lOVCA+PSA2NAogIGlmICh0eXBlMSA9PSBpbnRUSV90eXBl X25vZGUgfHwgdHlwZTEgPT0gdW5zaWduZWRfaW50VElfdHlwZV9ub2RlKQog ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFRJX3R5cGVfbm9k ZSA6IGludFRJX3R5cGVfbm9kZTsKI2VuZGlmCiAgaWYgKHR5cGUxID09IGlu dERJX3R5cGVfbm9kZSB8fCB0eXBlMSA9PSB1bnNpZ25lZF9pbnRESV90eXBl X25vZGUpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50RElf dHlwZV9ub2RlIDogaW50RElfdHlwZV9ub2RlOwogIGlmICh0eXBlMSA9PSBp bnRTSV90eXBlX25vZGUgfHwgdHlwZTEgPT0gdW5zaWduZWRfaW50U0lfdHlw ZV9ub2RlKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludFNJ X3R5cGVfbm9kZSA6IGludFNJX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0g aW50SElfdHlwZV9ub2RlIHx8IHR5cGUxID09IHVuc2lnbmVkX2ludEhJX3R5 cGVfbm9kZSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRI SV90eXBlX25vZGUgOiBpbnRISV90eXBlX25vZGU7CiAgaWYgKHR5cGUxID09 IGludFFJX3R5cGVfbm9kZSB8fCB0eXBlMSA9PSB1bnNpZ25lZF9pbnRRSV90 eXBlX25vZGUpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50 UUlfdHlwZV9ub2RlIDogaW50UUlfdHlwZV9ub2RlOwoKI2RlZmluZSBDX0NP TU1PTl9GSVhFRF9UWVBFUyhTQVQsTkFNRSkgXAogIGlmICh0eXBlMSA9PSBT QVQgIyMgc2hvcnRfICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCiAgICAgIHx8 IHR5cGUxID09IFNBVCAjIyB1bnNpZ25lZF9zaG9ydF8gIyMgTkFNRSAjIyBf dHlwZV9ub2RlKSBcCiAgICByZXR1cm4gdW5zaWduZWRwID8gU0FUICMjIHVu c2lnbmVkX3Nob3J0XyAjIyBOQU1FICMjIF90eXBlX25vZGUgXAoJCSAgICAg OiBTQVQgIyMgc2hvcnRfICMjIE5BTUUgIyMgX3R5cGVfbm9kZTsgXAogIGlm ICh0eXBlMSA9PSBTQVQgIyMgTkFNRSAjIyBfdHlwZV9ub2RlIFwKICAgICAg fHwgdHlwZTEgPT0gU0FUICMjIHVuc2lnbmVkXyAjIyBOQU1FICMjIF90eXBl X25vZGUpIFwKICAgIHJldHVybiB1bnNpZ25lZHAgPyBTQVQgIyMgdW5zaWdu ZWRfICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCgkJICAgICA6IFNBVCAjIyBO QU1FICMjIF90eXBlX25vZGU7IFwKICBpZiAodHlwZTEgPT0gU0FUICMjIGxv bmdfICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCiAgICAgIHx8IHR5cGUxID09 IFNBVCAjIyB1bnNpZ25lZF9sb25nXyAjIyBOQU1FICMjIF90eXBlX25vZGUp IFwKICAgIHJldHVybiB1bnNpZ25lZHAgPyBTQVQgIyMgdW5zaWduZWRfbG9u Z18gIyMgTkFNRSAjIyBfdHlwZV9ub2RlIFwKCQkgICAgIDogU0FUICMjIGxv bmdfICMjIE5BTUUgIyMgX3R5cGVfbm9kZTsgXAogIGlmICh0eXBlMSA9PSBT QVQgIyMgbG9uZ19sb25nXyAjIyBOQU1FICMjIF90eXBlX25vZGUgXAogICAg ICB8fCB0eXBlMSA9PSBTQVQgIyMgdW5zaWduZWRfbG9uZ19sb25nXyAjIyBO QU1FICMjIF90eXBlX25vZGUpIFwKICAgIHJldHVybiB1bnNpZ25lZHAgPyBT QVQgIyMgdW5zaWduZWRfbG9uZ19sb25nXyAjIyBOQU1FICMjIF90eXBlX25v ZGUgXAoJCSAgICAgOiBTQVQgIyMgbG9uZ19sb25nXyAjIyBOQU1FICMjIF90 eXBlX25vZGU7CgojZGVmaW5lIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMo U0FULE5BTUUpIFwKICBpZiAodHlwZTEgPT0gU0FUICMjIE5BTUUgIyMgX3R5 cGVfbm9kZSBcCiAgICAgIHx8IHR5cGUxID09IFNBVCAjIyB1ICMjIE5BTUUg IyMgX3R5cGVfbm9kZSkgXAogICAgcmV0dXJuIHVuc2lnbmVkcCA/IFNBVCAj IyB1ICMjIE5BTUUgIyMgX3R5cGVfbm9kZSBcCgkJICAgICA6IFNBVCAjIyBO QU1FICMjIF90eXBlX25vZGU7CgogIENfQ09NTU9OX0ZJWEVEX1RZUEVTICgs IGZyYWN0KTsKICBDX0NPTU1PTl9GSVhFRF9UWVBFUyAoc2F0XywgZnJhY3Qp OwogIENfQ09NTU9OX0ZJWEVEX1RZUEVTICgsIGFjY3VtKTsKICBDX0NPTU1P Tl9GSVhFRF9UWVBFUyAoc2F0XywgYWNjdW0pOwoKICBDX0NPTU1PTl9GSVhF RF9NT0RFX1RZUEVTICgsIHFxKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZ UEVTICgsIGhxKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTICgsIHNx KTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTICgsIGRxKTsKICBDX0NP TU1PTl9GSVhFRF9NT0RFX1RZUEVTICgsIHRxKTsKICBDX0NPTU1PTl9GSVhF RF9NT0RFX1RZUEVTIChzYXRfLCBxcSk7CiAgQ19DT01NT05fRklYRURfTU9E RV9UWVBFUyAoc2F0XywgaHEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQ RVMgKHNhdF8sIHNxKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTIChz YXRfLCBkcSk7CiAgQ19DT01NT05fRklYRURfTU9ERV9UWVBFUyAoc2F0Xywg dHEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKCwgaGEpOwogIENf Q09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKCwgc2EpOwogIENfQ09NTU9OX0ZJ WEVEX01PREVfVFlQRVMgKCwgZGEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVf VFlQRVMgKCwgdGEpOwogIENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKHNh dF8sIGhhKTsKICBDX0NPTU1PTl9GSVhFRF9NT0RFX1RZUEVTIChzYXRfLCBz YSk7CiAgQ19DT01NT05fRklYRURfTU9ERV9UWVBFUyAoc2F0XywgZGEpOwog IENfQ09NTU9OX0ZJWEVEX01PREVfVFlQRVMgKHNhdF8sIHRhKTsKCiAgLyog Rm9yIEVOVU1FUkFMX1RZUEVzIGluIEMrKywgbXVzdCBjaGVjayB0aGUgbW9k ZSBvZiB0aGUgdHlwZXMsIG5vdAogICAgIHRoZSBwcmVjaXNpb247IHRoZXkg aGF2ZSBwcmVjaXNpb24gc2V0IHRvIG1hdGNoIHRoZWlyIHJhbmdlLCBidXQK ICAgICBtYXkgdXNlIGEgd2lkZXIgbW9kZSB0byBtYXRjaCBhbiBBQkkuICBJ ZiB3ZSBjaGFuZ2UgbW9kZXMsIHdlIG1heQogICAgIHdpbmQgdXAgd2l0aCBi YWQgY29udmVyc2lvbnMuICBGb3IgSU5URUdFUl9UWVBFcyBpbiBDLCBtdXN0 IGNoZWNrCiAgICAgdGhlIHByZWNpc2lvbiBhcyB3ZWxsLCBzbyBhcyB0byB5 aWVsZCBjb3JyZWN0IHJlc3VsdHMgZm9yCiAgICAgYml0LWZpZWxkIHR5cGVz LiAgQysrIGRvZXMgbm90IGhhdmUgdGhlc2Ugc2VwYXJhdGUgYml0LWZpZWxk CiAgICAgdHlwZXMsIGFuZCBwcm9kdWNpbmcgYSBzaWduZWQgb3IgdW5zaWdu ZWQgdmFyaWFudCBvZiBhbgogICAgIEVOVU1FUkFMX1RZUEUgbWF5IGNhdXNl IG90aGVyIHByb2JsZW1zIGFzIHdlbGwuICAqLwoKICBpZiAoIUlOVEVHUkFM X1RZUEVfUCAodHlwZSkKICAgICAgfHwgVFlQRV9VTlNJR05FRCAodHlwZSkg PT0gdW5zaWduZWRwKQogICAgcmV0dXJuIHR5cGU7CgojZGVmaW5lIFRZUEVf T0sobm9kZSkJCQkJCQkJICAgIFwKICAoVFlQRV9NT0RFICh0eXBlKSA9PSBU WVBFX01PREUgKG5vZGUpCQkJCQkgICAgXAogICAmJiAoY19kaWFsZWN0X2N4 eCAoKSB8fCBUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQRV9QUkVDSVNJ T04gKG5vZGUpKSkKICBpZiAoVFlQRV9PSyAoc2lnbmVkX2NoYXJfdHlwZV9u b2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9jaGFyX3R5 cGVfbm9kZSA6IHNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKICBpZiAoVFlQRV9P SyAoaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/ IHVuc2lnbmVkX3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9ub2RlOwogIGlm IChUWVBFX09LIChzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZSkpCiAgICByZXR1 cm4gdW5zaWduZWRwID8gc2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlIDogc2hv cnRfaW50ZWdlcl90eXBlX25vZGU7CiAgaWYgKFRZUEVfT0sgKGxvbmdfaW50 ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdf dW5zaWduZWRfdHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsK ICBpZiAoVFlQRV9PSyAobG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlKSkK ICAgIHJldHVybiAodW5zaWduZWRwID8gbG9uZ19sb25nX3Vuc2lnbmVkX3R5 cGVfbm9kZQoJICAgIDogbG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlKTsK ICBpZiAoVFlQRV9PSyAod2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlX25v ZGUpKQogICAgcmV0dXJuICh1bnNpZ25lZHAgPyB3aWRlc3RfdW5zaWduZWRf bGl0ZXJhbF90eXBlX25vZGUKCSAgICA6IHdpZGVzdF9pbnRlZ2VyX2xpdGVy YWxfdHlwZV9ub2RlKTsKCiNpZiBIT1NUX0JJVFNfUEVSX1dJREVfSU5UID49 IDY0CiAgaWYgKFRZUEVfT0sgKGludFRJX3R5cGVfbm9kZSkpCiAgICByZXR1 cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50VElfdHlwZV9ub2RlIDogaW50 VElfdHlwZV9ub2RlOwojZW5kaWYKICBpZiAoVFlQRV9PSyAoaW50RElfdHlw ZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRE SV90eXBlX25vZGUgOiBpbnRESV90eXBlX25vZGU7CiAgaWYgKFRZUEVfT0sg KGludFNJX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5z aWduZWRfaW50U0lfdHlwZV9ub2RlIDogaW50U0lfdHlwZV9ub2RlOwogIGlm IChUWVBFX09LIChpbnRISV90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2ln bmVkcCA/IHVuc2lnbmVkX2ludEhJX3R5cGVfbm9kZSA6IGludEhJX3R5cGVf bm9kZTsKICBpZiAoVFlQRV9PSyAoaW50UUlfdHlwZV9ub2RlKSkKICAgIHJl dHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRRSV90eXBlX25vZGUgOiBp bnRRSV90eXBlX25vZGU7CiN1bmRlZiBUWVBFX09LCgogIGlmIChjX2RpYWxl Y3RfY3h4ICgpKQogICAgcmV0dXJuIHR5cGU7CiAgZWxzZQogICAgcmV0dXJu IGJ1aWxkX25vbnN0YW5kYXJkX2ludGVnZXJfdHlwZSAoVFlQRV9QUkVDSVNJ T04gKHR5cGUpLCB1bnNpZ25lZHApOwp9CgovKiBCdWlsZCBhIGJpdC1maWVs ZCBpbnRlZ2VyIHR5cGUgZm9yIHRoZSBnaXZlbiBXSURUSCBhbmQgVU5TSUdO RURQLiAgKi8KCnRyZWUKY19idWlsZF9iaXRmaWVsZF9pbnRlZ2VyX3R5cGUg KHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgd2lkdGgsIGludCB1bnNpZ25lZHAp CnsKICAvKiBFeHRlbmRlZCBpbnRlZ2VyIHR5cGVzIG9mIHRoZSBzYW1lIHdp ZHRoIGFzIGEgc3RhbmRhcmQgdHlwZSBoYXZlCiAgICAgbGVzc2VyIHJhbmss IHNvIHRob3NlIG9mIHRoZSBzYW1lIHdpZHRoIGFzIGludCBwcm9tb3RlIHRv IGludCBvcgogICAgIHVuc2lnbmVkIGludCBhbmQgYXJlIHZhbGlkIGZvciBw cmludGYgZm9ybWF0cyBleHBlY3RpbmcgaW50IG9yCiAgICAgdW5zaWduZWQg aW50LiAgVG8gYXZvaWQgc3VjaCBzcGVjaWFsIGNhc2VzLCBhdm9pZCBjcmVh dGluZwogICAgIGV4dGVuZGVkIGludGVnZXIgdHlwZXMgZm9yIGJpdC1maWVs ZHMgaWYgYSBzdGFuZGFyZCBpbnRlZ2VyIHR5cGUKICAgICBpcyBhdmFpbGFi bGUuICAqLwogIGlmICh3aWR0aCA9PSBUWVBFX1BSRUNJU0lPTiAoaW50ZWdl cl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVk X3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9ub2RlOwogIGlmICh3aWR0aCA9 PSBUWVBFX1BSRUNJU0lPTiAoc2lnbmVkX2NoYXJfdHlwZV9ub2RlKSkKICAg IHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9jaGFyX3R5cGVfbm9kZSA6 IHNpZ25lZF9jaGFyX3R5cGVfbm9kZTsKICBpZiAod2lkdGggPT0gVFlQRV9Q UkVDSVNJT04gKHNob3J0X2ludGVnZXJfdHlwZV9ub2RlKSkKICAgIHJldHVy biB1bnNpZ25lZHAgPyBzaG9ydF91bnNpZ25lZF90eXBlX25vZGUgOiBzaG9y dF9pbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAod2lkdGggPT0gVFlQRV9QUkVD SVNJT04gKGxvbmdfaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVu c2lnbmVkcCA/IGxvbmdfdW5zaWduZWRfdHlwZV9ub2RlIDogbG9uZ19pbnRl Z2VyX3R5cGVfbm9kZTsKICBpZiAod2lkdGggPT0gVFlQRV9QUkVDSVNJT04g KGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gKHVu c2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUKCSAgICA6 IGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSk7CiAgcmV0dXJuIGJ1aWxk X25vbnN0YW5kYXJkX2ludGVnZXJfdHlwZSAod2lkdGgsIHVuc2lnbmVkcCk7 Cn0KCi8qIFRoZSBDIHZlcnNpb24gb2YgdGhlIHJlZ2lzdGVyX2J1aWx0aW5f dHlwZSBsYW5naG9vay4gICovCgp2b2lkCmNfcmVnaXN0ZXJfYnVpbHRpbl90 eXBlICh0cmVlIHR5cGUsIGNvbnN0IGNoYXIqIG5hbWUpCnsKICB0cmVlIGRl Y2w7CgogIGRlY2wgPSBidWlsZF9kZWNsIChUWVBFX0RFQ0wsIGdldF9pZGVu dGlmaWVyIChuYW1lKSwgdHlwZSk7CiAgREVDTF9BUlRJRklDSUFMIChkZWNs KSA9IDE7CiAgaWYgKCFUWVBFX05BTUUgKHR5cGUpKQogICAgVFlQRV9OQU1F ICh0eXBlKSA9IGRlY2w7CiAgcHVzaGRlY2wgKGRlY2wpOwoKICByZWdpc3Rl cmVkX2J1aWx0aW5fdHlwZXMgPSB0cmVlX2NvbnMgKDAsIHR5cGUsIHJlZ2lz dGVyZWRfYnVpbHRpbl90eXBlcyk7Cn0KCgwKLyogUmV0dXJuIHRoZSBtaW5p bXVtIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgVkFMVUUg aW4gYQogICBzaWduZWQgb3IgdW5zaWduZWQgdHlwZSwgVU5TSUdORURQIHNh eXMgd2hpY2guICAqLwoKdW5zaWduZWQgaW50Cm1pbl9wcmVjaXNpb24gKHRy ZWUgdmFsdWUsIGludCB1bnNpZ25lZHApCnsKICBpbnQgbG9nOwoKICAvKiBJ ZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUsIGNvbXB1dGUgaXRzIG5lZ2F0aXZl IG1pbnVzIDEuICBUaGUgbGF0dGVyCiAgICAgYWRqdXN0bWVudCBpcyBiZWNh dXNlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgbGFyZ2VzdCBuZWdhdGl2 ZSB2YWx1ZQogICAgIGlzIG9uZSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBw b3NpdGl2ZSB2YWx1ZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwogICAgIGEg Yml0LXdpc2UgbmVnYXRpb24sIHNvIHVzZSB0aGF0IG9wZXJhdGlvbiBpbnN0 ZWFkLiAgKi8KCiAgaWYgKHRyZWVfaW50X2NzdF9zZ24gKHZhbHVlKSA8IDAp CiAgICB2YWx1ZSA9IGZvbGRfYnVpbGQxIChCSVRfTk9UX0VYUFIsIFRSRUVf VFlQRSAodmFsdWUpLCB2YWx1ZSk7CgogIC8qIFJldHVybiB0aGUgbnVtYmVy IG9mIGJpdHMgbmVlZGVkLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBmYWN0 CiAgICAgdGhhdCB3ZSBuZWVkIG9uZSBtb3JlIGJpdCBmb3IgYSBzaWduZWQg dGhhbiB1bnNpZ25lZCB0eXBlLiAgKi8KCiAgaWYgKGludGVnZXJfemVyb3Ag KHZhbHVlKSkKICAgIGxvZyA9IDA7CiAgZWxzZQogICAgbG9nID0gdHJlZV9m bG9vcl9sb2cyICh2YWx1ZSk7CgogIHJldHVybiBsb2cgKyAxICsgIXVuc2ln bmVkcDsKfQoMCi8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgZm9yIGludmFs aWQgb3BlcmFuZHMgdG8gYXJpdGggb3BlcmF0aW9uCiAgIENPREUgd2l0aCBU WVBFMCBmb3Igb3BlcmFuZCAwLCBhbmQgVFlQRTEgZm9yIG9wZXJhbmQgMS4g ICovCgp2b2lkCmJpbmFyeV9vcF9lcnJvciAoZW51bSB0cmVlX2NvZGUgY29k ZSwgdHJlZSB0eXBlMCwgdHJlZSB0eXBlMSkKewogIGNvbnN0IGNoYXIgKm9w bmFtZTsKCiAgc3dpdGNoIChjb2RlKQogICAgewogICAgY2FzZSBQTFVTX0VY UFI6CiAgICAgIG9wbmFtZSA9ICIrIjsgYnJlYWs7CiAgICBjYXNlIE1JTlVT X0VYUFI6CiAgICAgIG9wbmFtZSA9ICItIjsgYnJlYWs7CiAgICBjYXNlIE1V TFRfRVhQUjoKICAgICAgb3BuYW1lID0gIioiOyBicmVhazsKICAgIGNhc2Ug TUFYX0VYUFI6CiAgICAgIG9wbmFtZSA9ICJtYXgiOyBicmVhazsKICAgIGNh c2UgTUlOX0VYUFI6CiAgICAgIG9wbmFtZSA9ICJtaW4iOyBicmVhazsKICAg IGNhc2UgRVFfRVhQUjoKICAgICAgb3BuYW1lID0gIj09IjsgYnJlYWs7CiAg ICBjYXNlIE5FX0VYUFI6CiAgICAgIG9wbmFtZSA9ICIhPSI7IGJyZWFrOwog ICAgY2FzZSBMRV9FWFBSOgogICAgICBvcG5hbWUgPSAiPD0iOyBicmVhazsK ICAgIGNhc2UgR0VfRVhQUjoKICAgICAgb3BuYW1lID0gIj49IjsgYnJlYWs7 CiAgICBjYXNlIExUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI8IjsgYnJlYWs7 CiAgICBjYXNlIEdUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI+IjsgYnJlYWs7 CiAgICBjYXNlIExTSElGVF9FWFBSOgogICAgICBvcG5hbWUgPSAiPDwiOyBi cmVhazsKICAgIGNhc2UgUlNISUZUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI+ PiI7IGJyZWFrOwogICAgY2FzZSBUUlVOQ19NT0RfRVhQUjoKICAgIGNhc2Ug RkxPT1JfTU9EX0VYUFI6CiAgICAgIG9wbmFtZSA9ICIlIjsgYnJlYWs7CiAg ICBjYXNlIFRSVU5DX0RJVl9FWFBSOgogICAgY2FzZSBGTE9PUl9ESVZfRVhQ UjoKICAgICAgb3BuYW1lID0gIi8iOyBicmVhazsKICAgIGNhc2UgQklUX0FO RF9FWFBSOgogICAgICBvcG5hbWUgPSAiJiI7IGJyZWFrOwogICAgY2FzZSBC SVRfSU9SX0VYUFI6CiAgICAgIG9wbmFtZSA9ICJ8IjsgYnJlYWs7CiAgICBj YXNlIFRSVVRIX0FORElGX0VYUFI6CiAgICAgIG9wbmFtZSA9ICImJiI7IGJy ZWFrOwogICAgY2FzZSBUUlVUSF9PUklGX0VYUFI6CiAgICAgIG9wbmFtZSA9 ICJ8fCI7IGJyZWFrOwogICAgY2FzZSBCSVRfWE9SX0VYUFI6CiAgICAgIG9w bmFtZSA9ICJeIjsgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5y ZWFjaGFibGUgKCk7CiAgICB9CiAgZXJyb3IgKCJpbnZhbGlkIG9wZXJhbmRz IHRvIGJpbmFyeSAlcyAoaGF2ZSAlcVQgYW5kICVxVCkiLCBvcG5hbWUsCgkg dHlwZTAsIHR5cGUxKTsKfQoMCi8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfYmlu YXJ5X29wLCB1c2VkIGZvciBjb21wYXJpc29uIG9wZXJhdGlvbnMuCiAgIFNl ZSBpZiB0aGUgb3BlcmFuZHMgaGF2ZSBib3RoIGJlZW4gY29udmVydGVkIGZy b20gc3Vid29yZCBpbnRlZ2VyIHR5cGVzCiAgIGFuZCwgaWYgc28sIHBlcmhh cHMgY2hhbmdlIHRoZW0gYm90aCBiYWNrIHRvIHRoZWlyIG9yaWdpbmFsIHR5 cGUuCiAgIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyByZXNwb25zaWJsZSBmb3Ig Y29udmVydGluZyB0aGUgdHdvIG9wZXJhbmRzCiAgIHRvIHRoZSBwcm9wZXIg Y29tbW9uIHR5cGUgZm9yIGNvbXBhcmlzb24uCgogICBUaGUgYXJndW1lbnRz IG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFsbCBwb2ludGVycyB0byBsb2NhbCB2 YXJpYWJsZXMKICAgb2YgYnVpbGRfYmluYXJ5X29wOiBPUDBfUFRSIGlzICZP UDAsIE9QMV9QVFIgaXMgJk9QMSwKICAgUkVTVFlQRV9QVFIgaXMgJlJFU1VM VF9UWVBFIGFuZCBSRVNDT0RFX1BUUiBpcyAmUkVTVUxUQ09ERS4KCiAgIElm IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBub256ZXJvLCBpdCBtZWFucyB0aGF0 IHRoZSBjb21wYXJpc29uIGhhcwogICBhIGNvbnN0YW50IHZhbHVlLiAgV2hh dCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgaXMgYW4gZXhwcmVzc2lvbiBmb3IK ICAgdGhhdCB2YWx1ZS4gICovCgp0cmVlCnNob3J0ZW5fY29tcGFyZSAodHJl ZSAqb3AwX3B0ciwgdHJlZSAqb3AxX3B0ciwgdHJlZSAqcmVzdHlwZV9wdHIs CgkJIGVudW0gdHJlZV9jb2RlICpyZXNjb2RlX3B0cikKewogIHRyZWUgdHlw ZTsKICB0cmVlIG9wMCA9ICpvcDBfcHRyOwogIHRyZWUgb3AxID0gKm9wMV9w dHI7CiAgaW50IHVuc2lnbmVkcDAsIHVuc2lnbmVkcDE7CiAgaW50IHJlYWwx LCByZWFsMjsKICB0cmVlIHByaW1vcDAsIHByaW1vcDE7CiAgZW51bSB0cmVl X2NvZGUgY29kZSA9ICpyZXNjb2RlX3B0cjsKCiAgLyogVGhyb3cgYXdheSBh bnkgY29udmVyc2lvbnMgdG8gd2lkZXIgdHlwZXMKICAgICBhbHJlYWR5IHBy ZXNlbnQgaW4gdGhlIG9wZXJhbmRzLiAgKi8KCiAgcHJpbW9wMCA9IGdldF9u YXJyb3dlciAob3AwLCAmdW5zaWduZWRwMCk7CiAgcHJpbW9wMSA9IGdldF9u YXJyb3dlciAob3AxLCAmdW5zaWduZWRwMSk7CgogIC8qIEhhbmRsZSB0aGUg Y2FzZSB0aGF0IE9QMCBkb2VzIG5vdCAqY29udGFpbiogYSBjb252ZXJzaW9u CiAgICAgYnV0IGl0ICpyZXF1aXJlcyogY29udmVyc2lvbiB0byBGSU5BTF9U WVBFLiAgKi8KCiAgaWYgKG9wMCA9PSBwcmltb3AwICYmIFRSRUVfVFlQRSAo b3AwKSAhPSAqcmVzdHlwZV9wdHIpCiAgICB1bnNpZ25lZHAwID0gVFlQRV9V TlNJR05FRCAoVFJFRV9UWVBFIChvcDApKTsKICBpZiAob3AxID09IHByaW1v cDEgJiYgVFJFRV9UWVBFIChvcDEpICE9ICpyZXN0eXBlX3B0cikKICAgIHVu c2lnbmVkcDEgPSBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG9wMSkpOwoK ICAvKiBJZiBvbmUgb2YgdGhlIG9wZXJhbmRzIG11c3QgYmUgZmxvYXRlZCwg d2UgY2Fubm90IG9wdGltaXplLiAgKi8KICByZWFsMSA9IFRSRUVfQ09ERSAo VFJFRV9UWVBFIChwcmltb3AwKSkgPT0gUkVBTF9UWVBFOwogIHJlYWwyID0g VFJFRV9DT0RFIChUUkVFX1RZUEUgKHByaW1vcDEpKSA9PSBSRUFMX1RZUEU7 CgogIC8qIElmIGZpcnN0IGFyZyBpcyBjb25zdGFudCwgc3dhcCB0aGUgYXJn cyAoY2hhbmdpbmcgb3BlcmF0aW9uCiAgICAgc28gdmFsdWUgaXMgcHJlc2Vy dmVkKSwgZm9yIGNhbm9uaWNhbGl6YXRpb24uICBEb24ndCBkbyB0aGlzIGlm CiAgICAgdGhlIHNlY29uZCBhcmcgaXMgMC4gICovCgogIGlmIChUUkVFX0NP TlNUQU5UIChwcmltb3AwKQogICAgICAmJiAhaW50ZWdlcl96ZXJvcCAocHJp bW9wMSkgJiYgIXJlYWxfemVyb3AgKHByaW1vcDEpCiAgICAgICYmICFmaXhl ZF96ZXJvcCAocHJpbW9wMSkpCiAgICB7CiAgICAgIHRyZWUgdGVtID0gcHJp bW9wMDsKICAgICAgaW50IHRlbWkgPSB1bnNpZ25lZHAwOwogICAgICBwcmlt b3AwID0gcHJpbW9wMTsKICAgICAgcHJpbW9wMSA9IHRlbTsKICAgICAgdGVt ID0gb3AwOwogICAgICBvcDAgPSBvcDE7CiAgICAgIG9wMSA9IHRlbTsKICAg ICAgKm9wMF9wdHIgPSBvcDA7CiAgICAgICpvcDFfcHRyID0gb3AxOwogICAg ICB1bnNpZ25lZHAwID0gdW5zaWduZWRwMTsKICAgICAgdW5zaWduZWRwMSA9 IHRlbWk7CiAgICAgIHRlbWkgPSByZWFsMTsKICAgICAgcmVhbDEgPSByZWFs MjsKICAgICAgcmVhbDIgPSB0ZW1pOwoKICAgICAgc3dpdGNoIChjb2RlKQoJ ewoJY2FzZSBMVF9FWFBSOgoJICBjb2RlID0gR1RfRVhQUjsKCSAgYnJlYWs7 CgljYXNlIEdUX0VYUFI6CgkgIGNvZGUgPSBMVF9FWFBSOwoJICBicmVhazsK CWNhc2UgTEVfRVhQUjoKCSAgY29kZSA9IEdFX0VYUFI7CgkgIGJyZWFrOwoJ Y2FzZSBHRV9FWFBSOgoJICBjb2RlID0gTEVfRVhQUjsKCSAgYnJlYWs7Cglk ZWZhdWx0OgoJICBicmVhazsKCX0KICAgICAgKnJlc2NvZGVfcHRyID0gY29k ZTsKICAgIH0KCiAgLyogSWYgY29tcGFyaW5nIGFuIGludGVnZXIgYWdhaW5z dCBhIGNvbnN0YW50IG1vcmUgYml0cyB3aWRlLAogICAgIG1heWJlIHdlIGNh biBkZWR1Y2UgYSB2YWx1ZSBvZiAxIG9yIDAgaW5kZXBlbmRlbnQgb2YgdGhl IGRhdGEuCiAgICAgT3IgZWxzZSB0cnVuY2F0ZSB0aGUgY29uc3RhbnQgbm93 CiAgICAgcmF0aGVyIHRoYW4gZXh0ZW5kIHRoZSB2YXJpYWJsZSBhdCBydW4g dGltZS4KCiAgICAgVGhpcyBpcyBvbmx5IGludGVyZXN0aW5nIGlmIHRoZSBj b25zdGFudCBpcyB0aGUgd2lkZXIgYXJnLgogICAgIEFsc28sIGl0IGlzIG5v dCBzYWZlIGlmIHRoZSBjb25zdGFudCBpcyB1bnNpZ25lZCBhbmQgdGhlCiAg ICAgdmFyaWFibGUgYXJnIGlzIHNpZ25lZCwgc2luY2UgaW4gdGhpcyBjYXNl IHRoZSB2YXJpYWJsZQogICAgIHdvdWxkIGJlIHNpZ24tZXh0ZW5kZWQgYW5k IHRoZW4gcmVnYXJkZWQgYXMgdW5zaWduZWQuCiAgICAgT3VyIHRlY2huaXF1 ZSBmYWlscyBpbiB0aGlzIGNhc2UgYmVjYXVzZSB0aGUgbG93ZXN0L2hpZ2hl c3QKICAgICBwb3NzaWJsZSB1bnNpZ25lZCByZXN1bHRzIGRvbid0IGZvbGxv dyBuYXR1cmFsbHkgZnJvbSB0aGUKICAgICBsb3dlc3QvaGlnaGVzdCBwb3Nz aWJsZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlIG9wZXJhbmQuCiAgICAgRm9y IGp1c3QgRVFfRVhQUiBhbmQgTkVfRVhQUiB0aGVyZSBpcyBhbm90aGVyIHRl Y2huaXF1ZSB0aGF0CiAgICAgY291bGQgYmUgdXNlZDogc2VlIGlmIHRoZSBj b25zdGFudCBjYW4gYmUgZmFpdGhmdWxseSByZXByZXNlbnRlZAogICAgIGlu IHRoZSBvdGhlciBvcGVyYW5kJ3MgdHlwZSwgYnkgdHJ1bmNhdGluZyBpdCBh bmQgcmVleHRlbmRpbmcgaXQKICAgICBhbmQgc2VlIGlmIHRoYXQgcHJlc2Vy dmVzIHRoZSBjb25zdGFudCdzIHZhbHVlLiAgKi8KCiAgaWYgKCFyZWFsMSAm JiAhcmVhbDIKICAgICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKHByaW1v cDApKSAhPSBGSVhFRF9QT0lOVF9UWVBFCiAgICAgICYmIFRSRUVfQ09ERSAo cHJpbW9wMSkgPT0gSU5URUdFUl9DU1QKICAgICAgJiYgVFlQRV9QUkVDSVNJ T04gKFRSRUVfVFlQRSAocHJpbW9wMCkpIDwgVFlQRV9QUkVDSVNJT04gKCpy ZXN0eXBlX3B0cikpCiAgICB7CiAgICAgIGludCBtaW5fZ3QsIG1heF9ndCwg bWluX2x0LCBtYXhfbHQ7CiAgICAgIHRyZWUgbWF4dmFsLCBtaW52YWw7CiAg ICAgIC8qIDEgaWYgY29tcGFyaXNvbiBpcyBub21pbmFsbHkgdW5zaWduZWQu ICAqLwogICAgICBpbnQgdW5zaWduZWRwID0gVFlQRV9VTlNJR05FRCAoKnJl c3R5cGVfcHRyKTsKICAgICAgdHJlZSB2YWw7CgogICAgICB0eXBlID0gY19j b21tb25fc2lnbmVkX29yX3Vuc2lnbmVkX3R5cGUgKHVuc2lnbmVkcDAsCgkJ CQkJICAgICAgIFRSRUVfVFlQRSAocHJpbW9wMCkpOwoKICAgICAgbWF4dmFs ID0gVFlQRV9NQVhfVkFMVUUgKHR5cGUpOwogICAgICBtaW52YWwgPSBUWVBF X01JTl9WQUxVRSAodHlwZSk7CgogICAgICBpZiAodW5zaWduZWRwICYmICF1 bnNpZ25lZHAwKQoJKnJlc3R5cGVfcHRyID0gY19jb21tb25fc2lnbmVkX3R5 cGUgKCpyZXN0eXBlX3B0cik7CgogICAgICBpZiAoVFJFRV9UWVBFIChwcmlt b3AxKSAhPSAqcmVzdHlwZV9wdHIpCgl7CgkgIC8qIENvbnZlcnQgcHJpbW9w MSB0byB0YXJnZXQgdHlwZSwgYnV0IGRvIG5vdCBpbnRyb2R1Y2UKCSAgICAg YWRkaXRpb25hbCBvdmVyZmxvdy4gIFdlIGtub3cgcHJpbW9wMSBpcyBhbiBp bnRfY3N0LiAgKi8KCSAgcHJpbW9wMSA9IGZvcmNlX2ZpdF90eXBlX2RvdWJs ZSAoKnJlc3R5cGVfcHRyLAoJCQkJCSAgIFRSRUVfSU5UX0NTVF9MT1cgKHBy aW1vcDEpLAoJCQkJCSAgIFRSRUVfSU5UX0NTVF9ISUdIIChwcmltb3AxKSwg MCwKCQkJCQkgICBUUkVFX09WRVJGTE9XIChwcmltb3AxKSk7Cgl9CiAgICAg IGlmICh0eXBlICE9ICpyZXN0eXBlX3B0cikKCXsKCSAgbWludmFsID0gY29u dmVydCAoKnJlc3R5cGVfcHRyLCBtaW52YWwpOwoJICBtYXh2YWwgPSBjb252 ZXJ0ICgqcmVzdHlwZV9wdHIsIG1heHZhbCk7Cgl9CgogICAgICBpZiAodW5z aWduZWRwICYmIHVuc2lnbmVkcDApCgl7CgkgIG1pbl9ndCA9IElOVF9DU1Rf TFRfVU5TSUdORUQgKHByaW1vcDEsIG1pbnZhbCk7CgkgIG1heF9ndCA9IElO VF9DU1RfTFRfVU5TSUdORUQgKHByaW1vcDEsIG1heHZhbCk7CgkgIG1pbl9s dCA9IElOVF9DU1RfTFRfVU5TSUdORUQgKG1pbnZhbCwgcHJpbW9wMSk7Cgkg IG1heF9sdCA9IElOVF9DU1RfTFRfVU5TSUdORUQgKG1heHZhbCwgcHJpbW9w MSk7Cgl9CiAgICAgIGVsc2UKCXsKCSAgbWluX2d0ID0gSU5UX0NTVF9MVCAo cHJpbW9wMSwgbWludmFsKTsKCSAgbWF4X2d0ID0gSU5UX0NTVF9MVCAocHJp bW9wMSwgbWF4dmFsKTsKCSAgbWluX2x0ID0gSU5UX0NTVF9MVCAobWludmFs LCBwcmltb3AxKTsKCSAgbWF4X2x0ID0gSU5UX0NTVF9MVCAobWF4dmFsLCBw cmltb3AxKTsKCX0KCiAgICAgIHZhbCA9IDA7CiAgICAgIC8qIFRoaXMgdXNl ZCB0byBiZSBhIHN3aXRjaCwgYnV0IEdlbml4IGNvbXBpbGVyIGNhbid0IGhh bmRsZSB0aGF0LiAgKi8KICAgICAgaWYgKGNvZGUgPT0gTkVfRVhQUikKCXsK CSAgaWYgKG1heF9sdCB8fCBtaW5fZ3QpCgkgICAgdmFsID0gdHJ1dGh2YWx1 ZV90cnVlX25vZGU7Cgl9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gRVFfRVhQ UikKCXsKCSAgaWYgKG1heF9sdCB8fCBtaW5fZ3QpCgkgICAgdmFsID0gdHJ1 dGh2YWx1ZV9mYWxzZV9ub2RlOwoJfQogICAgICBlbHNlIGlmIChjb2RlID09 IExUX0VYUFIpCgl7CgkgIGlmIChtYXhfbHQpCgkgICAgdmFsID0gdHJ1dGh2 YWx1ZV90cnVlX25vZGU7CgkgIGlmICghbWluX2x0KQoJICAgIHZhbCA9IHRy dXRodmFsdWVfZmFsc2Vfbm9kZTsKCX0KICAgICAgZWxzZSBpZiAoY29kZSA9 PSBHVF9FWFBSKQoJewoJICBpZiAobWluX2d0KQoJICAgIHZhbCA9IHRydXRo dmFsdWVfdHJ1ZV9ub2RlOwoJICBpZiAoIW1heF9ndCkKCSAgICB2YWwgPSB0 cnV0aHZhbHVlX2ZhbHNlX25vZGU7Cgl9CiAgICAgIGVsc2UgaWYgKGNvZGUg PT0gTEVfRVhQUikKCXsKCSAgaWYgKCFtYXhfZ3QpCgkgICAgdmFsID0gdHJ1 dGh2YWx1ZV90cnVlX25vZGU7CgkgIGlmIChtaW5fZ3QpCgkgICAgdmFsID0g dHJ1dGh2YWx1ZV9mYWxzZV9ub2RlOwoJfQogICAgICBlbHNlIGlmIChjb2Rl ID09IEdFX0VYUFIpCgl7CgkgIGlmICghbWluX2x0KQoJICAgIHZhbCA9IHRy dXRodmFsdWVfdHJ1ZV9ub2RlOwoJICBpZiAobWF4X2x0KQoJICAgIHZhbCA9 IHRydXRodmFsdWVfZmFsc2Vfbm9kZTsKCX0KCiAgICAgIC8qIElmIHByaW1v cDAgd2FzIHNpZ24tZXh0ZW5kZWQgYW5kIHVuc2lnbmVkIGNvbXBhcmlzb24g c3BlY2QsCgkgd2UgZGlkIGEgc2lnbmVkIGNvbXBhcmlzb24gYWJvdmUgdXNp bmcgdGhlIHNpZ25lZCB0eXBlIGJvdW5kcy4KCSBCdXQgdGhlIGNvbXBhcmlz b24gd2Ugb3V0cHV0IG11c3QgYmUgdW5zaWduZWQuCgoJIEFsc28sIGZvciBp bmVxdWFsaXRpZXMsIFZBTCBpcyBubyBnb29kOyBidXQgaWYgdGhlIHNpZ25l ZAoJIGNvbXBhcmlzb24gaGFkICphbnkqIGZpeGVkIHJlc3VsdCwgaXQgZm9s bG93cyB0aGF0IHRoZQoJIHVuc2lnbmVkIGNvbXBhcmlzb24ganVzdCB0ZXN0 cyB0aGUgc2lnbiBpbiByZXZlcnNlCgkgKHBvc2l0aXZlIHZhbHVlcyBhcmUg TEUsIG5lZ2F0aXZlIG9uZXMgR0UpLgoJIFNvIHdlIGNhbiBnZW5lcmF0ZSBh biB1bnNpZ25lZCBjb21wYXJpc29uCgkgYWdhaW5zdCBhbiBleHRyZW1lIHZh bHVlIG9mIHRoZSBzaWduZWQgdHlwZS4gICovCgogICAgICBpZiAodW5zaWdu ZWRwICYmICF1bnNpZ25lZHAwKQoJewoJICBpZiAodmFsICE9IDApCgkgICAg c3dpdGNoIChjb2RlKQoJICAgICAgewoJICAgICAgY2FzZSBMVF9FWFBSOgoJ ICAgICAgY2FzZSBHRV9FWFBSOgoJCXByaW1vcDEgPSBUWVBFX01JTl9WQUxV RSAodHlwZSk7CgkJdmFsID0gMDsKCQlicmVhazsKCgkgICAgICBjYXNlIExF X0VYUFI6CgkgICAgICBjYXNlIEdUX0VYUFI6CgkJcHJpbW9wMSA9IFRZUEVf TUFYX1ZBTFVFICh0eXBlKTsKCQl2YWwgPSAwOwoJCWJyZWFrOwoKCSAgICAg IGRlZmF1bHQ6CgkJYnJlYWs7CgkgICAgICB9CgkgIHR5cGUgPSBjX2NvbW1v bl91bnNpZ25lZF90eXBlICh0eXBlKTsKCX0KCiAgICAgIGlmIChUUkVFX0NP REUgKHByaW1vcDApICE9IElOVEVHRVJfQ1NUKQoJewoJICBpZiAodmFsID09 IHRydXRodmFsdWVfZmFsc2Vfbm9kZSkKCSAgICB3YXJuaW5nIChPUFRfV3R5 cGVfbGltaXRzLCAiY29tcGFyaXNvbiBpcyBhbHdheXMgZmFsc2UgZHVlIHRv IGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIik7CgkgIGlmICh2YWwgPT0g dHJ1dGh2YWx1ZV90cnVlX25vZGUpCgkgICAgd2FybmluZyAoT1BUX1d0eXBl X2xpbWl0cywgImNvbXBhcmlzb24gaXMgYWx3YXlzIHRydWUgZHVlIHRvIGxp bWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIik7Cgl9CgogICAgICBpZiAodmFs ICE9IDApCgl7CgkgIC8qIERvbid0IGZvcmdldCB0byBldmFsdWF0ZSBQUklN T1AwIGlmIGl0IGhhcyBzaWRlIGVmZmVjdHMuICAqLwoJICBpZiAoVFJFRV9T SURFX0VGRkVDVFMgKHByaW1vcDApKQoJICAgIHJldHVybiBidWlsZDIgKENP TVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAodmFsKSwgcHJpbW9wMCwgdmFsKTsK CSAgcmV0dXJuIHZhbDsKCX0KCiAgICAgIC8qIFZhbHVlIGlzIG5vdCBwcmVk ZXRlcm1pbmVkLCBidXQgZG8gdGhlIGNvbXBhcmlzb24KCSBpbiB0aGUgdHlw ZSBvZiB0aGUgb3BlcmFuZCB0aGF0IGlzIG5vdCBjb25zdGFudC4KCSBUWVBF IGlzIGFscmVhZHkgcHJvcGVybHkgc2V0LiAgKi8KICAgIH0KCiAgLyogSWYg ZWl0aGVyIGFyZyBpcyBkZWNpbWFsIGZsb2F0IGFuZCB0aGUgb3RoZXIgaXMg ZmxvYXQsIGZpbmQgdGhlCiAgICAgcHJvcGVyIGNvbW1vbiB0eXBlIHRvIHVz ZSBmb3IgY29tcGFyaXNvbi4gICovCiAgZWxzZSBpZiAocmVhbDEgJiYgcmVh bDIKCSAgICYmIChERUNJTUFMX0ZMT0FUX01PREVfUCAoVFlQRV9NT0RFIChU UkVFX1RZUEUgKHByaW1vcDApKSkKCSAgICAgICB8fCBERUNJTUFMX0ZMT0FU X01PREVfUCAoVFlQRV9NT0RFIChUUkVFX1RZUEUgKHByaW1vcDEpKSkpKQog ICAgdHlwZSA9IGNvbW1vbl90eXBlIChUUkVFX1RZUEUgKHByaW1vcDApLCBU UkVFX1RZUEUgKHByaW1vcDEpKTsKCiAgZWxzZSBpZiAocmVhbDEgJiYgcmVh bDIKCSAgICYmIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChwcmltb3Aw KSkKCSAgICAgICA9PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChwcmlt b3AxKSkpKQogICAgdHlwZSA9IFRSRUVfVFlQRSAocHJpbW9wMCk7CgogIC8q IElmIGFyZ3MnIG5hdHVyYWwgdHlwZXMgYXJlIGJvdGggbmFycm93ZXIgdGhh biBub21pbmFsIHR5cGUKICAgICBhbmQgYm90aCBleHRlbmQgaW4gdGhlIHNh bWUgbWFubmVyLCBjb21wYXJlIHRoZW0KICAgICBpbiB0aGUgdHlwZSBvZiB0 aGUgd2lkZXIgYXJnLgogICAgIE90aGVyd2lzZSBtdXN0IGFjdHVhbGx5IGV4 dGVuZCBib3RoIHRvIHRoZSBub21pbmFsCiAgICAgY29tbW9uIHR5cGUgbGVz dCBkaWZmZXJlbnQgd2F5cyBvZiBleHRlbmRpbmcKICAgICBhbHRlciB0aGUg cmVzdWx0LgogICAgIChlZywgKHNob3J0KS0xID09ICh1bnNpZ25lZCBzaG9y dCktMSAgc2hvdWxkIGJlIDAuKSAgKi8KCiAgZWxzZSBpZiAodW5zaWduZWRw MCA9PSB1bnNpZ25lZHAxICYmIHJlYWwxID09IHJlYWwyCgkgICAmJiBUWVBF X1BSRUNJU0lPTiAoVFJFRV9UWVBFIChwcmltb3AwKSkgPCBUWVBFX1BSRUNJ U0lPTiAoKnJlc3R5cGVfcHRyKQoJICAgJiYgVFlQRV9QUkVDSVNJT04gKFRS RUVfVFlQRSAocHJpbW9wMSkpIDwgVFlQRV9QUkVDSVNJT04gKCpyZXN0eXBl X3B0cikpCiAgICB7CiAgICAgIHR5cGUgPSBjb21tb25fdHlwZSAoVFJFRV9U WVBFIChwcmltb3AwKSwgVFJFRV9UWVBFIChwcmltb3AxKSk7CiAgICAgIHR5 cGUgPSBjX2NvbW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAodW5zaWdu ZWRwMAoJCQkJCSAgICAgICB8fCBUWVBFX1VOU0lHTkVEICgqcmVzdHlwZV9w dHIpLAoJCQkJCSAgICAgICB0eXBlKTsKICAgICAgLyogTWFrZSBzdXJlIHNo b3J0ZXIgb3BlcmFuZCBpcyBleHRlbmRlZCB0aGUgcmlnaHQgd2F5CgkgdG8g bWF0Y2ggdGhlIGxvbmdlciBvcGVyYW5kLiAgKi8KICAgICAgcHJpbW9wMAoJ PSBjb252ZXJ0IChjX2NvbW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAo dW5zaWduZWRwMCwKCQkJCQkJICAgICBUUkVFX1RZUEUgKHByaW1vcDApKSwK CQkgICBwcmltb3AwKTsKICAgICAgcHJpbW9wMQoJPSBjb252ZXJ0IChjX2Nv bW1vbl9zaWduZWRfb3JfdW5zaWduZWRfdHlwZSAodW5zaWduZWRwMSwKCQkJ CQkJICAgICBUUkVFX1RZUEUgKHByaW1vcDEpKSwKCQkgICBwcmltb3AxKTsK ICAgIH0KICBlbHNlCiAgICB7CiAgICAgIC8qIEhlcmUgd2UgbXVzdCBkbyB0 aGUgY29tcGFyaXNvbiBvbiB0aGUgbm9taW5hbCB0eXBlCgkgdXNpbmcgdGhl IGFyZ3MgZXhhY3RseSBhcyB3ZSByZWNlaXZlZCB0aGVtLiAgKi8KICAgICAg dHlwZSA9ICpyZXN0eXBlX3B0cjsKICAgICAgcHJpbW9wMCA9IG9wMDsKICAg ICAgcHJpbW9wMSA9IG9wMTsKCiAgICAgIGlmICghcmVhbDEgJiYgIXJlYWwy ICYmIGludGVnZXJfemVyb3AgKHByaW1vcDEpCgkgICYmIFRZUEVfVU5TSUdO RUQgKCpyZXN0eXBlX3B0cikpCgl7CgkgIHRyZWUgdmFsdWUgPSAwOwoJICBz d2l0Y2ggKGNvZGUpCgkgICAgewoJICAgIGNhc2UgR0VfRVhQUjoKCSAgICAg IC8qIEFsbCB1bnNpZ25lZCB2YWx1ZXMgYXJlID49IDAsIHNvIHdlIHdhcm4u ICBIb3dldmVyLAoJCSBpZiBPUDAgaXMgYSBjb25zdGFudCB0aGF0IGlzID49 IDAsIHRoZSBzaWduZWRuZXNzIG9mCgkJIHRoZSBjb21wYXJpc29uIGlzbid0 IGFuIGlzc3VlLCBzbyBzdXBwcmVzcyB0aGUKCQkgd2FybmluZy4gICovCgkg ICAgICBpZiAod2Fybl90eXBlX2xpbWl0cyAmJiAhaW5fc3lzdGVtX2hlYWRl cgoJCSAgJiYgIShUUkVFX0NPREUgKHByaW1vcDApID09IElOVEVHRVJfQ1NU CgkJICAgICAgICYmICFUUkVFX09WRVJGTE9XIChjb252ZXJ0IChjX2NvbW1v bl9zaWduZWRfdHlwZSAodHlwZSksCgkJCQkJCSAgIHByaW1vcDApKSkpCgkJ d2FybmluZyAoT1BUX1d0eXBlX2xpbWl0cywgCgkJCSAiY29tcGFyaXNvbiBv ZiB1bnNpZ25lZCBleHByZXNzaW9uID49IDAgaXMgYWx3YXlzIHRydWUiKTsK CSAgICAgIHZhbHVlID0gdHJ1dGh2YWx1ZV90cnVlX25vZGU7CgkgICAgICBi cmVhazsKCgkgICAgY2FzZSBMVF9FWFBSOgoJICAgICAgaWYgKHdhcm5fdHlw ZV9saW1pdHMgJiYgIWluX3N5c3RlbV9oZWFkZXIKCQkgICYmICEoVFJFRV9D T0RFIChwcmltb3AwKSA9PSBJTlRFR0VSX0NTVAoJCSAgICAgICAmJiAhVFJF RV9PVkVSRkxPVyAoY29udmVydCAoY19jb21tb25fc2lnbmVkX3R5cGUgKHR5 cGUpLAoJCQkJCQkgICBwcmltb3AwKSkpKQoJCXdhcm5pbmcgKE9QVF9XdHlw ZV9saW1pdHMsIAoJCQkgImNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVz c2lvbiA8IDAgaXMgYWx3YXlzIGZhbHNlIik7CgkgICAgICB2YWx1ZSA9IHRy dXRodmFsdWVfZmFsc2Vfbm9kZTsKCSAgICAgIGJyZWFrOwoKCSAgICBkZWZh dWx0OgoJICAgICAgYnJlYWs7CgkgICAgfQoKCSAgaWYgKHZhbHVlICE9IDAp CgkgICAgewoJICAgICAgLyogRG9uJ3QgZm9yZ2V0IHRvIGV2YWx1YXRlIFBS SU1PUDAgaWYgaXQgaGFzIHNpZGUgZWZmZWN0cy4gICovCgkgICAgICBpZiAo VFJFRV9TSURFX0VGRkVDVFMgKHByaW1vcDApKQoJCXJldHVybiBidWlsZDIg KENPTVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAodmFsdWUpLAoJCQkgICAgICAg cHJpbW9wMCwgdmFsdWUpOwoJICAgICAgcmV0dXJuIHZhbHVlOwoJICAgIH0K CX0KICAgIH0KCiAgKm9wMF9wdHIgPSBjb252ZXJ0ICh0eXBlLCBwcmltb3Aw KTsKICAqb3AxX3B0ciA9IGNvbnZlcnQgKHR5cGUsIHByaW1vcDEpOwoKICAq cmVzdHlwZV9wdHIgPSB0cnV0aHZhbHVlX3R5cGVfbm9kZTsKCiAgcmV0dXJu IDA7Cn0KDAovKiBSZXR1cm4gYSB0cmVlIGZvciB0aGUgc3VtIG9yIGRpZmZl cmVuY2UgKFJFU1VMVENPREUgc2F5cyB3aGljaCkKICAgb2YgcG9pbnRlciBQ VFJPUCBhbmQgaW50ZWdlciBJTlRPUC4gICovCgp0cmVlCnBvaW50ZXJfaW50 X3N1bSAoZW51bSB0cmVlX2NvZGUgcmVzdWx0Y29kZSwgdHJlZSBwdHJvcCwg dHJlZSBpbnRvcCkKewogIHRyZWUgc2l6ZV9leHAsIHJldDsKCiAgLyogVGhl IHJlc3VsdCBpcyBhIHBvaW50ZXIgb2YgdGhlIHNhbWUgdHlwZSB0aGF0IGlz IGJlaW5nIGFkZGVkLiAgKi8KICB0cmVlIHJlc3VsdF90eXBlID0gVFJFRV9U WVBFIChwdHJvcCk7CgogIGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAocmVz dWx0X3R5cGUpKSA9PSBWT0lEX1RZUEUpCiAgICB7CiAgICAgIGlmIChwZWRh bnRpYyB8fCB3YXJuX3BvaW50ZXJfYXJpdGgpCglwZWR3YXJuICgicG9pbnRl ciBvZiB0eXBlICU8dm9pZCAqJT4gdXNlZCBpbiBhcml0aG1ldGljIik7CiAg ICAgIHNpemVfZXhwID0gaW50ZWdlcl9vbmVfbm9kZTsKICAgIH0KICBlbHNl IGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAocmVzdWx0X3R5cGUpKSA9PSBG VU5DVElPTl9UWVBFKQogICAgewogICAgICBpZiAocGVkYW50aWMgfHwgd2Fy bl9wb2ludGVyX2FyaXRoKQoJcGVkd2FybiAoInBvaW50ZXIgdG8gYSBmdW5j dGlvbiB1c2VkIGluIGFyaXRobWV0aWMiKTsKICAgICAgc2l6ZV9leHAgPSBp bnRlZ2VyX29uZV9ub2RlOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09ERSAo VFJFRV9UWVBFIChyZXN1bHRfdHlwZSkpID09IE1FVEhPRF9UWVBFKQogICAg ewogICAgICBpZiAocGVkYW50aWMgfHwgd2Fybl9wb2ludGVyX2FyaXRoKQoJ cGVkd2FybiAoInBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHVzZWQgaW4g YXJpdGhtZXRpYyIpOwogICAgICBzaXplX2V4cCA9IGludGVnZXJfb25lX25v ZGU7CiAgICB9CiAgZWxzZQogICAgc2l6ZV9leHAgPSBzaXplX2luX2J5dGVz IChUUkVFX1RZUEUgKHJlc3VsdF90eXBlKSk7CgogIC8qIFdlIGFyZSBtYW5p cHVsYXRpbmcgcG9pbnRlciB2YWx1ZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8g d2FybgogICAgIGFib3V0IHJlbHlpbmcgb24gdW5kZWZpbmVkIHNpZ25lZCBv dmVyZmxvdy4gIFdlIGRpc2FibGUgdGhlCiAgICAgd2FybmluZyBoZXJlIGJl Y2F1c2Ugd2UgdXNlIGludGVnZXIgdHlwZXMgc28gZm9sZCB3b24ndCBrbm93 IHRoYXQKICAgICB0aGV5IGFyZSByZWFsbHkgcG9pbnRlcnMuICAqLwogIGZv bGRfZGVmZXJfb3ZlcmZsb3dfd2FybmluZ3MgKCk7CgogIC8qIElmIHdoYXQg d2UgYXJlIGFib3V0IHRvIG11bHRpcGx5IGJ5IHRoZSBzaXplIG9mIHRoZSBl bGVtZW50cwogICAgIGNvbnRhaW5zIGEgY29uc3RhbnQgdGVybSwgYXBwbHkg ZGlzdHJpYnV0aXZlIGxhdwogICAgIGFuZCBtdWx0aXBseSB0aGF0IGNvbnN0 YW50IHRlcm0gc2VwYXJhdGVseS4KICAgICBUaGlzIGhlbHBzIHByb2R1Y2Ug Y29tbW9uIHN1YmV4cHJlc3Npb25zLiAgKi8KICBpZiAoKFRSRUVfQ09ERSAo aW50b3ApID09IFBMVVNfRVhQUiB8fCBUUkVFX0NPREUgKGludG9wKSA9PSBN SU5VU19FWFBSKQogICAgICAmJiAhVFJFRV9DT05TVEFOVCAoaW50b3ApCiAg ICAgICYmIFRSRUVfQ09OU1RBTlQgKFRSRUVfT1BFUkFORCAoaW50b3AsIDEp KQogICAgICAmJiBUUkVFX0NPTlNUQU5UIChzaXplX2V4cCkKICAgICAgLyog SWYgdGhlIGNvbnN0YW50IGNvbWVzIGZyb20gcG9pbnRlciBzdWJ0cmFjdGlv biwKCSBza2lwIHRoaXMgb3B0aW1pemF0aW9uLS1pdCB3b3VsZCBjYXVzZSBh biBlcnJvci4gICovCiAgICAgICYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChU UkVFX09QRVJBTkQgKGludG9wLCAwKSkpID09IElOVEVHRVJfVFlQRQogICAg ICAvKiBJZiB0aGUgY29uc3RhbnQgaXMgdW5zaWduZWQsIGFuZCBzbWFsbGVy IHRoYW4gdGhlIHBvaW50ZXIgc2l6ZSwKCSB0aGVuIHdlIG11c3Qgc2tpcCB0 aGlzIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgYmVjYXVzZSBpdCBjb3VsZCBj YXVzZQoJIGFuIG92ZXJmbG93IGVycm9yIGlmIHRoZSBjb25zdGFudCBpcyBu ZWdhdGl2ZSBidXQgSU5UT1AgaXMgbm90LiAgKi8KICAgICAgJiYgKCFUWVBF X1VOU0lHTkVEIChUUkVFX1RZUEUgKGludG9wKSkKCSAgfHwgKFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKGludG9wKSkKCSAgICAgID09IFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKHB0cm9wKSkpKSkKICAgIHsKICAgICAgZW51 bSB0cmVlX2NvZGUgc3ViY29kZSA9IHJlc3VsdGNvZGU7CiAgICAgIHRyZWUg aW50X3R5cGUgPSBUUkVFX1RZUEUgKGludG9wKTsKICAgICAgaWYgKFRSRUVf Q09ERSAoaW50b3ApID09IE1JTlVTX0VYUFIpCglzdWJjb2RlID0gKHN1YmNv ZGUgPT0gUExVU19FWFBSID8gTUlOVVNfRVhQUiA6IFBMVVNfRVhQUik7CiAg ICAgIC8qIENvbnZlcnQgYm90aCBzdWJleHByZXNzaW9uIHR5cGVzIHRvIHRo ZSB0eXBlIG9mIGludG9wLAoJIGJlY2F1c2Ugd2VpcmQgY2FzZXMgaW52b2x2 aW5nIHBvaW50ZXIgYXJpdGhtZXRpYwoJIGNhbiByZXN1bHQgaW4gYSBzdW0g b3IgZGlmZmVyZW5jZSB3aXRoIGRpZmZlcmVudCB0eXBlIGFyZ3MuICAqLwog ICAgICBwdHJvcCA9IGJ1aWxkX2JpbmFyeV9vcCAoc3ViY29kZSwgcHRyb3As CgkJCSAgICAgICBjb252ZXJ0IChpbnRfdHlwZSwgVFJFRV9PUEVSQU5EIChp bnRvcCwgMSkpLCAxKTsKICAgICAgaW50b3AgPSBjb252ZXJ0IChpbnRfdHlw ZSwgVFJFRV9PUEVSQU5EIChpbnRvcCwgMCkpOwogICAgfQoKICAvKiBDb252 ZXJ0IHRoZSBpbnRlZ2VyIGFyZ3VtZW50IHRvIGEgdHlwZSB0aGUgc2FtZSBz aXplIGFzIHNpemV0eXBlCiAgICAgc28gdGhlIG11bHRpcGx5IHdvbid0IG92 ZXJmbG93IHNwdXJpb3VzbHkuICAqLwogIGlmIChUWVBFX1BSRUNJU0lPTiAo VFJFRV9UWVBFIChpbnRvcCkpICE9IFRZUEVfUFJFQ0lTSU9OIChzaXpldHlw ZSkKICAgICAgfHwgVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChpbnRvcCkp ICE9IFRZUEVfVU5TSUdORUQgKHNpemV0eXBlKSkKICAgIGludG9wID0gY29u dmVydCAoY19jb21tb25fdHlwZV9mb3Jfc2l6ZSAoVFlQRV9QUkVDSVNJT04g KHNpemV0eXBlKSwKCQkJCQkgICAgIFRZUEVfVU5TSUdORUQgKHNpemV0eXBl KSksIGludG9wKTsKCiAgLyogUmVwbGFjZSB0aGUgaW50ZWdlciBhcmd1bWVu dCB3aXRoIGEgc3VpdGFibGUgcHJvZHVjdCBieSB0aGUgb2JqZWN0IHNpemUu CiAgICAgRG8gdGhpcyBtdWx0aXBsaWNhdGlvbiBhcyBzaWduZWQsIHRoZW4g Y29udmVydCB0byB0aGUgYXBwcm9wcmlhdGUKICAgICB0eXBlIGZvciB0aGUg cG9pbnRlciBvcGVyYXRpb24uICAqLwogIGludG9wID0gY29udmVydCAoc2l6 ZXR5cGUsCgkJICAgYnVpbGRfYmluYXJ5X29wIChNVUxUX0VYUFIsIGludG9w LAoJCQkJICAgIGNvbnZlcnQgKFRSRUVfVFlQRSAoaW50b3ApLCBzaXplX2V4 cCksIDEpKTsKCiAgLyogQ3JlYXRlIHRoZSBzdW0gb3IgZGlmZmVyZW5jZS4g ICovCiAgaWYgKHJlc3VsdGNvZGUgPT0gTUlOVVNfRVhQUikKICAgIGludG9w ID0gZm9sZF9idWlsZDEgKE5FR0FURV9FWFBSLCBzaXpldHlwZSwgaW50b3Ap OwoKICByZXQgPSBmb2xkX2J1aWxkMiAoUE9JTlRFUl9QTFVTX0VYUFIsIHJl c3VsdF90eXBlLCBwdHJvcCwgaW50b3ApOwoKICBmb2xkX3VuZGVmZXJfYW5k X2lnbm9yZV9vdmVyZmxvd193YXJuaW5ncyAoKTsKCiAgcmV0dXJuIHJldDsK fQoMCi8qIFJldHVybiB3aGV0aGVyIEVYUFIgaXMgYSBkZWNsYXJhdGlvbiB3 aG9zZSBhZGRyZXNzIGNhbiBuZXZlciBiZQogICBOVUxMLiAgKi8KCmJvb2wK ZGVjbF93aXRoX25vbm51bGxfYWRkcl9wIChjb25zdF90cmVlIGV4cHIpCnsK ICByZXR1cm4gKERFQ0xfUCAoZXhwcikKCSAgJiYgKFRSRUVfQ09ERSAoZXhw cikgPT0gUEFSTV9ERUNMCgkgICAgICB8fCBUUkVFX0NPREUgKGV4cHIpID09 IExBQkVMX0RFQ0wKCSAgICAgIHx8ICFERUNMX1dFQUsgKGV4cHIpKSk7Cn0K Ci8qIFByZXBhcmUgZXhwciB0byBiZSBhbiBhcmd1bWVudCBvZiBhIFRSVVRI X05PVF9FWFBSLAogICBvciBmb3IgYW4gYGlmJyBvciBgd2hpbGUnIHN0YXRl bWVudCBvciA/Li46IGV4cC4gIEl0IHNob3VsZCBhbHJlYWR5CiAgIGhhdmUg YmVlbiB2YWxpZGF0ZWQgdG8gYmUgb2Ygc3VpdGFibGUgdHlwZTsgb3RoZXJ3 aXNlLCBhIGJhZAogICBkaWFnbm9zdGljIG1heSByZXN1bHQuCgogICBUaGlz IHByZXBhcmF0aW9uIGNvbnNpc3RzIG9mIHRha2luZyB0aGUgb3JkaW5hcnkK ICAgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBleHByIGFuZCBw cm9kdWNpbmcgYSB2YWxpZCB0cmVlCiAgIGJvb2xlYW4gZXhwcmVzc2lvbiBk ZXNjcmliaW5nIHdoZXRoZXIgZXhwciBpcyBub256ZXJvLiAgV2UgY291bGQK ICAgc2ltcGx5IGFsd2F5cyBkbyBidWlsZF9iaW5hcnlfb3AgKE5FX0VYUFIs IGV4cHIsIHRydXRodmFsdWVfZmFsc2Vfbm9kZSwgMSksCiAgIGJ1dCB3ZSBv cHRpbWl6ZSBjb21wYXJpc29ucywgJiYsIHx8LCBhbmQgIS4KCiAgIFRoZSBy ZXN1bHRpbmcgdHlwZSBzaG91bGQgYWx3YXlzIGJlIGB0cnV0aHZhbHVlX3R5 cGVfbm9kZScuICAqLwoKdHJlZQpjX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZl cnNpb24gKHRyZWUgZXhwcikKewogIHN3aXRjaCAoVFJFRV9DT0RFIChleHBy KSkKICAgIHsKICAgIGNhc2UgRVFfRVhQUjogICBjYXNlIE5FX0VYUFI6ICAg Y2FzZSBVTkVRX0VYUFI6IGNhc2UgTFRHVF9FWFBSOgogICAgY2FzZSBMRV9F WFBSOiAgIGNhc2UgR0VfRVhQUjogICBjYXNlIExUX0VYUFI6ICAgY2FzZSBH VF9FWFBSOgogICAgY2FzZSBVTkxFX0VYUFI6IGNhc2UgVU5HRV9FWFBSOiBj YXNlIFVOTFRfRVhQUjogY2FzZSBVTkdUX0VYUFI6CiAgICBjYXNlIE9SREVS RURfRVhQUjogY2FzZSBVTk9SREVSRURfRVhQUjoKICAgICAgaWYgKFRSRUVf VFlQRSAoZXhwcikgPT0gdHJ1dGh2YWx1ZV90eXBlX25vZGUpCglyZXR1cm4g ZXhwcjsKICAgICAgcmV0dXJuIGJ1aWxkMiAoVFJFRV9DT0RFIChleHByKSwg dHJ1dGh2YWx1ZV90eXBlX25vZGUsCgkJICAgICBUUkVFX09QRVJBTkQgKGV4 cHIsIDApLCBUUkVFX09QRVJBTkQgKGV4cHIsIDEpKTsKCiAgICBjYXNlIFRS VVRIX0FORElGX0VYUFI6CiAgICBjYXNlIFRSVVRIX09SSUZfRVhQUjoKICAg IGNhc2UgVFJVVEhfQU5EX0VYUFI6CiAgICBjYXNlIFRSVVRIX09SX0VYUFI6 CiAgICBjYXNlIFRSVVRIX1hPUl9FWFBSOgogICAgICBpZiAoVFJFRV9UWVBF IChleHByKSA9PSB0cnV0aHZhbHVlX3R5cGVfbm9kZSkKCXJldHVybiBleHBy OwogICAgICByZXR1cm4gYnVpbGQyIChUUkVFX0NPREUgKGV4cHIpLCB0cnV0 aHZhbHVlX3R5cGVfbm9kZSwKCQkgY19jb21tb25fdHJ1dGh2YWx1ZV9jb252 ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSwKCQkgY19jb21tb25f dHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDEp KSk7CgogICAgY2FzZSBUUlVUSF9OT1RfRVhQUjoKICAgICAgaWYgKFRSRUVf VFlQRSAoZXhwcikgPT0gdHJ1dGh2YWx1ZV90eXBlX25vZGUpCglyZXR1cm4g ZXhwcjsKICAgICAgcmV0dXJuIGJ1aWxkMSAoVFJFRV9DT0RFIChleHByKSwg dHJ1dGh2YWx1ZV90eXBlX25vZGUsCgkJIGNfY29tbW9uX3RydXRodmFsdWVf Y29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpOwoKICAgIGNh c2UgRVJST1JfTUFSSzoKICAgICAgcmV0dXJuIGV4cHI7CgogICAgY2FzZSBJ TlRFR0VSX0NTVDoKICAgICAgcmV0dXJuIGludGVnZXJfemVyb3AgKGV4cHIp ID8gdHJ1dGh2YWx1ZV9mYWxzZV9ub2RlCgkJCQkgIDogdHJ1dGh2YWx1ZV90 cnVlX25vZGU7CgogICAgY2FzZSBSRUFMX0NTVDoKICAgICAgcmV0dXJuIHJl YWxfY29tcGFyZSAoTkVfRVhQUiwgJlRSRUVfUkVBTF9DU1QgKGV4cHIpLCAm ZGNvbnN0MCkKCSAgICAgPyB0cnV0aHZhbHVlX3RydWVfbm9kZQoJICAgICA6 IHRydXRodmFsdWVfZmFsc2Vfbm9kZTsKCiAgICBjYXNlIEZJWEVEX0NTVDoK ICAgICAgcmV0dXJuIGZpeGVkX2NvbXBhcmUgKE5FX0VYUFIsICZUUkVFX0ZJ WEVEX0NTVCAoZXhwciksCgkJCSAgICAmRkNPTlNUMCAoVFlQRV9NT0RFIChU UkVFX1RZUEUgKGV4cHIpKSkpCgkgICAgID8gdHJ1dGh2YWx1ZV90cnVlX25v ZGUKCSAgICAgOiB0cnV0aHZhbHVlX2ZhbHNlX25vZGU7CgogICAgY2FzZSBG VU5DVElPTl9ERUNMOgogICAgICBleHByID0gYnVpbGRfdW5hcnlfb3AgKEFE RFJfRVhQUiwgZXhwciwgMCk7CiAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICov CgogICAgY2FzZSBBRERSX0VYUFI6CiAgICAgIHsKIAl0cmVlIGlubmVyID0g VFJFRV9PUEVSQU5EIChleHByLCAwKTsKCWlmIChkZWNsX3dpdGhfbm9ubnVs bF9hZGRyX3AgKGlubmVyKSkKCSAgewoJICAgIC8qIENvbW1vbiBBZGEvUGFz Y2FsIHByb2dyYW1tZXIncyBtaXN0YWtlLiAgKi8KCSAgICB3YXJuaW5nIChP UFRfV2FkZHJlc3MsCgkJICAgICAidGhlIGFkZHJlc3Mgb2YgJXFEIHdpbGwg YWx3YXlzIGV2YWx1YXRlIGFzICU8dHJ1ZSU+IiwKCQkgICAgIGlubmVyKTsK CSAgICByZXR1cm4gdHJ1dGh2YWx1ZV90cnVlX25vZGU7CgkgIH0KCgkvKiBJ ZiB3ZSBzdGlsbCBoYXZlIGEgZGVjbCwgaXQgaXMgcG9zc2libGUgZm9yIGl0 cyBhZGRyZXNzIHRvCgkgICBiZSBOVUxMLCBzbyB3ZSBjYW5ub3Qgb3B0aW1p emUuICAqLwoJaWYgKERFQ0xfUCAoaW5uZXIpKQoJICB7CgkgICAgZ2NjX2Fz c2VydCAoREVDTF9XRUFLIChpbm5lcikpOwoJICAgIGJyZWFrOwoJICB9CgoJ aWYgKFRSRUVfU0lERV9FRkZFQ1RTIChpbm5lcikpCgkgIHJldHVybiBidWls ZDIgKENPTVBPVU5EX0VYUFIsIHRydXRodmFsdWVfdHlwZV9ub2RlLAoJCQkg aW5uZXIsIHRydXRodmFsdWVfdHJ1ZV9ub2RlKTsKCWVsc2UKCSAgcmV0dXJu IHRydXRodmFsdWVfdHJ1ZV9ub2RlOwogICAgICB9CgogICAgY2FzZSBDT01Q TEVYX0VYUFI6CiAgICAgIHJldHVybiBidWlsZF9iaW5hcnlfb3AgKChUUkVF X1NJREVfRUZGRUNUUyAoVFJFRV9PUEVSQU5EIChleHByLCAxKSkKCQkJICAg ICAgID8gVFJVVEhfT1JfRVhQUiA6IFRSVVRIX09SSUZfRVhQUiksCgkJY19j b21tb25fdHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4 cHIsIDApKSwKCQljX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZlcnNpb24gKFRS RUVfT1BFUkFORCAoZXhwciwgMSkpLAoJCQkgICAgICAwKTsKCiAgICBjYXNl IE5FR0FURV9FWFBSOgogICAgY2FzZSBBQlNfRVhQUjoKICAgIGNhc2UgRkxP QVRfRVhQUjoKICAgICAgLyogVGhlc2UgZG9uJ3QgY2hhbmdlIHdoZXRoZXIg YW4gb2JqZWN0IGlzIG5vbnplcm8gb3IgemVyby4gICovCiAgICAgIHJldHVy biBjX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZlcnNpb24gKFRSRUVfT1BFUkFO RCAoZXhwciwgMCkpOwoKICAgIGNhc2UgTFJPVEFURV9FWFBSOgogICAgY2Fz ZSBSUk9UQVRFX0VYUFI6CiAgICAgIC8qIFRoZXNlIGRvbid0IGNoYW5nZSB3 aGV0aGVyIGFuIG9iamVjdCBpcyB6ZXJvIG9yIG5vbnplcm8sIGJ1dAoJIHdl IGNhbid0IGlnbm9yZSB0aGVtIGlmIHRoZWlyIHNlY29uZCBhcmcgaGFzIHNp ZGUtZWZmZWN0cy4gICovCiAgICAgIGlmIChUUkVFX1NJREVfRUZGRUNUUyAo VFJFRV9PUEVSQU5EIChleHByLCAxKSkpCglyZXR1cm4gYnVpbGQyIChDT01Q T1VORF9FWFBSLCB0cnV0aHZhbHVlX3R5cGVfbm9kZSwKCQkgICAgICAgVFJF RV9PUEVSQU5EIChleHByLCAxKSwKCQkgICAgICAgY19jb21tb25fdHJ1dGh2 YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSk7CiAg ICAgIGVsc2UKCXJldHVybiBjX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZlcnNp b24gKFRSRUVfT1BFUkFORCAoZXhwciwgMCkpOwoKICAgIGNhc2UgQ09ORF9F WFBSOgogICAgICAvKiBEaXN0cmlidXRlIHRoZSBjb252ZXJzaW9uIGludG8g dGhlIGFybXMgb2YgYSBDT05EX0VYUFIuICAqLwogICAgICByZXR1cm4gZm9s ZF9idWlsZDMgKENPTkRfRVhQUiwgdHJ1dGh2YWx1ZV90eXBlX25vZGUsCgkJ VFJFRV9PUEVSQU5EIChleHByLCAwKSwKCQljX2NvbW1vbl90cnV0aHZhbHVl X2NvbnZlcnNpb24gKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpLAoJCWNfY29t bW9uX3RydXRodmFsdWVfY29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHBy LCAyKSkpOwoKICAgIGNhc2UgQ09OVkVSVF9FWFBSOgogICAgY2FzZSBOT1Bf RVhQUjoKICAgICAgLyogRG9uJ3QgY2FuY2VsIHRoZSBlZmZlY3Qgb2YgYSBD T05WRVJUX0VYUFIgZnJvbSBhIFJFRkVSRU5DRV9UWVBFLAoJIHNpbmNlIHRo YXQgYWZmZWN0cyBob3cgYGRlZmF1bHRfY29udmVyc2lvbicgd2lsbCBiZWhh dmUuICAqLwogICAgICBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIp KSA9PSBSRUZFUkVOQ0VfVFlQRQoJICB8fCBUUkVFX0NPREUgKFRSRUVfVFlQ RSAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpID09IFJFRkVSRU5DRV9UWVBF KQoJYnJlYWs7CiAgICAgIC8qIElmIHRoaXMgaXMgd2lkZW5pbmcgdGhlIGFy Z3VtZW50LCB3ZSBjYW4gaWdub3JlIGl0LiAgKi8KICAgICAgaWYgKFRZUEVf UFJFQ0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKQoJICA+PSBUWVBFX1BSRUNJ U0lPTiAoVFJFRV9UWVBFIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSkpCgly ZXR1cm4gY19jb21tb25fdHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChUUkVFX09Q RVJBTkQgKGV4cHIsIDApKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNT0RJ RllfRVhQUjoKICAgICAgaWYgKCFUUkVFX05PX1dBUk5JTkcgKGV4cHIpCgkg ICYmIHdhcm5fcGFyZW50aGVzZXMpCgl7CgkgIHdhcm5pbmcgKE9QVF9XcGFy ZW50aGVzZXMsCgkJICAgInN1Z2dlc3QgcGFyZW50aGVzZXMgYXJvdW5kIGFz c2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZSIpOwoJICBUUkVFX05PX1dB Uk5JTkcgKGV4cHIpID0gMTsKCX0KICAgICAgYnJlYWs7CgogICAgZGVmYXVs dDoKICAgICAgYnJlYWs7CiAgICB9CgogIGlmIChUUkVFX0NPREUgKFRSRUVf VFlQRSAoZXhwcikpID09IENPTVBMRVhfVFlQRSkKICAgIHsKICAgICAgdHJl ZSB0ID0gc2F2ZV9leHByIChleHByKTsKICAgICAgcmV0dXJuIChidWlsZF9i aW5hcnlfb3AKCSAgICAgICgoVFJFRV9TSURFX0VGRkVDVFMgKGV4cHIpCgkJ PyBUUlVUSF9PUl9FWFBSIDogVFJVVEhfT1JJRl9FWFBSKSwKCWNfY29tbW9u X3RydXRodmFsdWVfY29udmVyc2lvbiAoYnVpbGRfdW5hcnlfb3AgKFJFQUxQ QVJUX0VYUFIsIHQsIDApKSwKCWNfY29tbW9uX3RydXRodmFsdWVfY29udmVy c2lvbiAoYnVpbGRfdW5hcnlfb3AgKElNQUdQQVJUX0VYUFIsIHQsIDApKSwK CSAgICAgICAwKSk7CiAgICB9CgogIGlmIChUUkVFX0NPREUgKFRSRUVfVFlQ RSAoZXhwcikpID09IEZJWEVEX1BPSU5UX1RZUEUpCiAgICB7CiAgICAgIHRy ZWUgZml4ZWRfemVyb19ub2RlID0gYnVpbGRfZml4ZWQgKFRSRUVfVFlQRSAo ZXhwciksCgkJCQkJICBGQ09OU1QwIChUWVBFX01PREUKCQkJCQkJICAgKFRS RUVfVFlQRSAoZXhwcikpKSk7CiAgICAgIHJldHVybiBidWlsZF9iaW5hcnlf b3AgKE5FX0VYUFIsIGV4cHIsIGZpeGVkX3plcm9fbm9kZSwgMSk7CiAgICB9 CgogIHJldHVybiBidWlsZF9iaW5hcnlfb3AgKE5FX0VYUFIsIGV4cHIsIGlu dGVnZXJfemVyb19ub2RlLCAxKTsKfQoMCnN0YXRpYyB2b2lkIGRlZl9idWls dGluXzEgIChlbnVtIGJ1aWx0X2luX2Z1bmN0aW9uIGZuY29kZSwKCQkJICAg IGNvbnN0IGNoYXIgKm5hbWUsCgkJCSAgICBlbnVtIGJ1aWx0X2luX2NsYXNz IGZuY2xhc3MsCgkJCSAgICB0cmVlIGZudHlwZSwgdHJlZSBsaWJ0eXBlLAoJ CQkgICAgYm9vbCBib3RoX3AsIGJvb2wgZmFsbGJhY2tfcCwgYm9vbCBub25h bnNpX3AsCgkJCSAgICB0cmVlIGZuYXR0cnMsIGJvb2wgaW1wbGljaXRfcCk7 CgoKLyogQXBwbHkgdGhlIFRZUEVfUVVBTFMgdG8gdGhlIG5ldyBERUNMLiAg Ki8KCnZvaWQKY19hcHBseV90eXBlX3F1YWxzX3RvX2RlY2wgKGludCB0eXBl X3F1YWxzLCB0cmVlIGRlY2wpCnsKICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUg KGRlY2wpOwoKICBpZiAodHlwZSA9PSBlcnJvcl9tYXJrX25vZGUpCiAgICBy ZXR1cm47CgogIGlmICgoKHR5cGVfcXVhbHMgJiBUWVBFX1FVQUxfQ09OU1Qp CiAgICAgICB8fCAodHlwZSAmJiBUUkVFX0NPREUgKHR5cGUpID09IFJFRkVS RU5DRV9UWVBFKSkKICAgICAgLyogQW4gb2JqZWN0IGRlY2xhcmVkICdjb25z dCcgaXMgb25seSByZWFkb25seSBhZnRlciBpdCBpcwoJIGluaXRpYWxpemVk LiAgV2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IG9mIGV4cHJlc3NpbmcgdGhpcyBj dXJyZW50bHksCgkgc28gd2UgbmVlZCB0byBiZSBjb25zZXJ2YXRpdmUgYW5k IHVuc2V0IFRSRUVfUkVBRE9OTFkgZm9yIHR5cGVzCgkgd2l0aCBjb25zdHJ1 Y3RvcnMuICBPdGhlcndpc2UgYWxpYXNpbmcgY29kZSB3aWxsIGlnbm9yZSBz dG9yZXMgaW4KCSBhbiBpbmxpbmUgY29uc3RydWN0b3IuICAqLwogICAgICAm JiAhKHR5cGUgJiYgVFlQRV9ORUVEU19DT05TVFJVQ1RJTkcgKHR5cGUpKSkK ICAgIFRSRUVfUkVBRE9OTFkgKGRlY2wpID0gMTsKICBpZiAodHlwZV9xdWFs cyAmIFRZUEVfUVVBTF9WT0xBVElMRSkKICAgIHsKICAgICAgVFJFRV9TSURF X0VGRkVDVFMgKGRlY2wpID0gMTsKICAgICAgVFJFRV9USElTX1ZPTEFUSUxF IChkZWNsKSA9IDE7CiAgICB9CiAgaWYgKHR5cGVfcXVhbHMgJiBUWVBFX1FV QUxfUkVTVFJJQ1QpCiAgICB7CiAgICAgIHdoaWxlICh0eXBlICYmIFRSRUVf Q09ERSAodHlwZSkgPT0gQVJSQVlfVFlQRSkKCS8qIEFsbG93ICdyZXN0cmlj dCcgb24gYXJyYXlzIG9mIHBvaW50ZXJzLgoJICAgRklYTUUgY3VycmVudGx5 IHdlIGp1c3QgaWdub3JlIGl0LiAgKi8KCXR5cGUgPSBUUkVFX1RZUEUgKHR5 cGUpOwogICAgICBpZiAoIXR5cGUKCSAgfHwgIVBPSU5URVJfVFlQRV9QICh0 eXBlKQoJICB8fCAhQ19UWVBFX09CSkVDVF9PUl9JTkNPTVBMRVRFX1AgKFRS RUVfVFlQRSAodHlwZSkpKQoJZXJyb3IgKCJpbnZhbGlkIHVzZSBvZiAlPHJl c3RyaWN0JT4iKTsKICAgICAgZWxzZSBpZiAoZmxhZ19zdHJpY3RfYWxpYXNp bmcgJiYgdHlwZSA9PSBUUkVFX1RZUEUgKGRlY2wpKQoJLyogSW5kaWNhdGUg d2UgbmVlZCB0byBtYWtlIGEgdW5pcXVlIGFsaWFzIHNldCBmb3IgdGhpcyBw b2ludGVyLgoJICAgV2UgY2FuJ3QgZG8gaXQgaGVyZSBiZWNhdXNlIGl0IG1p Z2h0IGJlIHBvaW50aW5nIHRvIGFuCgkgICBpbmNvbXBsZXRlIHR5cGUuICAq LwoJREVDTF9QT0lOVEVSX0FMSUFTX1NFVCAoZGVjbCkgPSAtMjsKICAgIH0K fQoKLyogSGFzaCBmdW5jdGlvbiBmb3IgdGhlIHByb2JsZW0gb2YgbXVsdGlw bGUgdHlwZSBkZWZpbml0aW9ucyBpbgogICBkaWZmZXJlbnQgZmlsZXMuICBU aGlzIG11c3QgaGFzaCBhbGwgdHlwZXMgdGhhdCB3aWxsIGNvbXBhcmUKICAg ZXF1YWwgdmlhIGNvbXB0eXBlcyB0byB0aGUgc2FtZSB2YWx1ZS4gIEluIHBy YWN0aWNlIGl0IGhhc2hlcwogICBvbiBzb21lIG9mIHRoZSBzaW1wbGUgc3R1 ZmYgYW5kIGxlYXZlcyB0aGUgZGV0YWlscyB0byBjb21wdHlwZXMuICAqLwoK c3RhdGljIGhhc2h2YWxfdApjX3R5cGVfaGFzaCAoY29uc3Qgdm9pZCAqcCkK ewogIGludCBpID0gMDsKICBpbnQgc2hpZnQsIHNpemU7CiAgY29uc3RfdHJl ZSBjb25zdCB0ID0gKGNvbnN0X3RyZWUpIHA7CiAgdHJlZSB0MjsKICBzd2l0 Y2ggKFRSRUVfQ09ERSAodCkpCiAgICB7CiAgICAvKiBGb3IgcG9pbnRlcnMs IGhhc2ggb24gcG9pbnRlZSB0eXBlIHBsdXMgc29tZSBzd2l6emxpbmcuICAq LwogICAgY2FzZSBQT0lOVEVSX1RZUEU6CiAgICAgIHJldHVybiBjX3R5cGVf aGFzaCAoVFJFRV9UWVBFICh0KSkgXiAweDMwMDMwMDM7CiAgICAvKiBIYXNo IG9uIG51bWJlciBvZiBlbGVtZW50cyBhbmQgdG90YWwgc2l6ZS4gICovCiAg ICBjYXNlIEVOVU1FUkFMX1RZUEU6CiAgICAgIHNoaWZ0ID0gMzsKICAgICAg dDIgPSBUWVBFX1ZBTFVFUyAodCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBS RUNPUkRfVFlQRToKICAgICAgc2hpZnQgPSAwOwogICAgICB0MiA9IFRZUEVf RklFTERTICh0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFFVQUxfVU5JT05f VFlQRToKICAgICAgc2hpZnQgPSAxOwogICAgICB0MiA9IFRZUEVfRklFTERT ICh0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFVOSU9OX1RZUEU6CiAgICAg IHNoaWZ0ID0gMjsKICAgICAgdDIgPSBUWVBFX0ZJRUxEUyAodCk7CiAgICAg IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZ2NjX3VucmVhY2hhYmxlICgp OwogICAgfQogIGZvciAoOyB0MjsgdDIgPSBUUkVFX0NIQUlOICh0MikpCiAg ICBpKys7CiAgc2l6ZSA9IFRSRUVfSU5UX0NTVF9MT1cgKFRZUEVfU0laRSAo dCkpOwogIHJldHVybiAoKHNpemUgPDwgMjQpIHwgKGkgPDwgc2hpZnQpKTsK fQoKc3RhdGljIEdUWSgocGFyYW1faXMgKHVuaW9uIHRyZWVfbm9kZSkpKSBo dGFiX3QgdHlwZV9oYXNoX3RhYmxlOwoKLyogUmV0dXJuIHRoZSB0eXBlZC1i YXNlZCBhbGlhcyBzZXQgZm9yIFQsIHdoaWNoIG1heSBiZSBhbiBleHByZXNz aW9uCiAgIG9yIGEgdHlwZS4gIFJldHVybiAtMSBpZiB3ZSBkb24ndCBkbyBh bnl0aGluZyBzcGVjaWFsLiAgKi8KCmFsaWFzX3NldF90eXBlCmNfY29tbW9u X2dldF9hbGlhc19zZXQgKHRyZWUgdCkKewogIHRyZWUgdTsKICBQVFIgKnNs b3Q7CgogIC8qIFBlcm1pdCB0eXBlLXB1bm5pbmcgd2hlbiBhY2Nlc3Npbmcg YSB1bmlvbiwgcHJvdmlkZWQgdGhlIGFjY2VzcwogICAgIGlzIGRpcmVjdGx5 IHRocm91Z2ggdGhlIHVuaW9uLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBk b2VzIG5vdAogICAgIHBlcm1pdCB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSB1 bmlvbiBtZW1iZXIgYW5kIHRoZW4gc3RvcmluZwogICAgIHRocm91Z2ggaXQu ICBFdmVuIHRoZSB0eXBlLXB1bm5pbmcgYWxsb3dlZCBoZXJlIGlzIGEgR0ND CiAgICAgZXh0ZW5zaW9uLCBhbGJlaXQgYSBjb21tb24gYW5kIHVzZWZ1bCBv bmU7IHRoZSBDIHN0YW5kYXJkIHNheXMKICAgICB0aGF0IHN1Y2ggYWNjZXNz ZXMgaGF2ZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGJlaGF2aW9yLiAgKi8K ICBmb3IgKHUgPSB0OwogICAgICAgVFJFRV9DT0RFICh1KSA9PSBDT01QT05F TlRfUkVGIHx8IFRSRUVfQ09ERSAodSkgPT0gQVJSQVlfUkVGOwogICAgICAg dSA9IFRSRUVfT1BFUkFORCAodSwgMCkpCiAgICBpZiAoVFJFRV9DT0RFICh1 KSA9PSBDT01QT05FTlRfUkVGCgkmJiBUUkVFX0NPREUgKFRSRUVfVFlQRSAo VFJFRV9PUEVSQU5EICh1LCAwKSkpID09IFVOSU9OX1RZUEUpCiAgICAgIHJl dHVybiAwOwoKICAvKiBUaGF0J3MgYWxsIHRoZSBleHByZXNzaW9ucyB3ZSBo YW5kbGUgc3BlY2lhbGx5LiAgKi8KICBpZiAoIVRZUEVfUCAodCkpCiAgICBy ZXR1cm4gLTE7CgogIC8qIFRoZSBDIHN0YW5kYXJkIGd1YXJhbnRlZXMgdGhh dCBhbnkgb2JqZWN0IG1heSBiZSBhY2Nlc3NlZCB2aWEgYW4KICAgICBsdmFs dWUgdGhhdCBoYXMgY2hhcmFjdGVyIHR5cGUuICAqLwogIGlmICh0ID09IGNo YXJfdHlwZV9ub2RlCiAgICAgIHx8IHQgPT0gc2lnbmVkX2NoYXJfdHlwZV9u b2RlCiAgICAgIHx8IHQgPT0gdW5zaWduZWRfY2hhcl90eXBlX25vZGUpCiAg ICByZXR1cm4gMDsKCiAgLyogSWYgaXQgaGFzIHRoZSBtYXlfYWxpYXMgYXR0 cmlidXRlLCBpdCBjYW4gYWxpYXMgYW55dGhpbmcuICAqLwogIGlmIChsb29r dXBfYXR0cmlidXRlICgibWF5X2FsaWFzIiwgVFlQRV9BVFRSSUJVVEVTICh0 KSkpCiAgICByZXR1cm4gMDsKCiAgLyogVGhlIEMgc3RhbmRhcmQgc3BlY2lm aWNhbGx5IGFsbG93cyBhbGlhc2luZyBiZXR3ZWVuIHNpZ25lZCBhbmQKICAg ICB1bnNpZ25lZCB2YXJpYW50cyBvZiB0aGUgc2FtZSB0eXBlLiAgV2UgdHJl YXQgdGhlIHNpZ25lZAogICAgIHZhcmlhbnQgYXMgY2Fub25pY2FsLiAgKi8K ICBpZiAoVFJFRV9DT0RFICh0KSA9PSBJTlRFR0VSX1RZUEUgJiYgVFlQRV9V TlNJR05FRCAodCkpCiAgICB7CiAgICAgIHRyZWUgdDEgPSBjX2NvbW1vbl9z aWduZWRfdHlwZSAodCk7CgogICAgICAvKiB0MSA9PSB0IGNhbiBoYXBwZW4g Zm9yIGJvb2xlYW4gbm9kZXMgd2hpY2ggYXJlIGFsd2F5cyB1bnNpZ25lZC4g ICovCiAgICAgIGlmICh0MSAhPSB0KQoJcmV0dXJuIGdldF9hbGlhc19zZXQg KHQxKTsKICAgIH0KICBlbHNlIGlmIChQT0lOVEVSX1RZUEVfUCAodCkpCiAg ICB7CiAgICAgIHRyZWUgdDE7CgogICAgICAvKiBVbmZvcnR1bmF0ZWx5LCB0 aGVyZSBpcyBubyBjYW5vbmljYWwgZm9ybSBvZiBhIHBvaW50ZXIgdHlwZS4K CSBJbiBwYXJ0aWN1bGFyLCBpZiB3ZSBoYXZlIGB0eXBlZGVmIGludCBJJywg dGhlbiBgaW50IConLCBhbmQKCSBgSSAqJyBhcmUgZGlmZmVyZW50IHR5cGVz LiAgU28sIHdlIGhhdmUgdG8gcGljayBhIGNhbm9uaWNhbAoJIHJlcHJlc2Vu dGF0aXZlLiAgV2UgZG8gdGhpcyBiZWxvdy4KCgkgVGVjaG5pY2FsbHksIHRo aXMgYXBwcm9hY2ggaXMgYWN0dWFsbHkgbW9yZSBjb25zZXJ2YXRpdmUgdGhh dAoJIGl0IG5lZWRzIHRvIGJlLiAgSW4gcGFydGljdWxhciwgYGNvbnN0IGlu dCAqJyBhbmQgYGludCAqJwoJIHNob3VsZCBiZSBpbiBkaWZmZXJlbnQgYWxp YXMgc2V0cywgYWNjb3JkaW5nIHRvIHRoZSBDIGFuZCBDKysKCSBzdGFuZGFy ZCwgc2luY2UgdGhlaXIgdHlwZXMgYXJlIG5vdCB0aGUgc2FtZSwgYW5kIHNv LAoJIHRlY2huaWNhbGx5LCBhbiBgaW50ICoqJyBhbmQgYGNvbnN0IGludCAq KicgY2Fubm90IHBvaW50IGF0CgkgdGhlIHNhbWUgdGhpbmcuCgoJIEJ1dCwg dGhlIHN0YW5kYXJkIGlzIHdyb25nLiAgSW4gcGFydGljdWxhciwgdGhpcyBj b2RlIGlzCgkgbGVnYWwgQysrOgoKCSAgICBpbnQgKmlwOwoJICAgIGludCAq KmlwcCA9ICZpcDsKCSAgICBjb25zdCBpbnQqIGNvbnN0KiBjaXBwID0gaXBw OwoKCSBBbmQsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgdGhhdCB0byBi ZSBsZWdhbCB1bmxlc3MgeW91CgkgY2FuIGRlcmVmZXJlbmNlIElQUCBhbmQg Q0lQUC4gIFNvLCB3ZSBpZ25vcmUgY3YtcXVhbGlmaWVycyBvbgoJIHRoZSBw b2ludGVkLXRvIHR5cGVzLiAgVGhpcyBpc3N1ZSBoYXMgYmVlbiByZXBvcnRl ZCB0byB0aGUKCSBDKysgY29tbWl0dGVlLiAgKi8KICAgICAgdDEgPSBidWls ZF90eXBlX25vX3F1YWxzICh0KTsKICAgICAgaWYgKHQxICE9IHQpCglyZXR1 cm4gZ2V0X2FsaWFzX3NldCAodDEpOwogICAgfQoKICAvKiBIYW5kbGUgdGhl IGNhc2Ugb2YgbXVsdGlwbGUgdHlwZSBub2RlcyByZWZlcnJpbmcgdG8gInRo ZSBzYW1lIiB0eXBlLAogICAgIHdoaWNoIG9jY3VycyB3aXRoIElNQS4gIFRo ZXNlIHNoYXJlIGFuIGFsaWFzIHNldC4gIEZJWE1FOiAgQ3VycmVudGx5IG9u bHkKICAgICBDOTAgaXMgaGFuZGxlZC4gIChJbiBDOTkgdHlwZSBjb21wYXRp YmlsaXR5IGlzIG5vdCB0cmFuc2l0aXZlLCB3aGljaAogICAgIGNvbXBsaWNh dGVzIHRoaW5ncyBtaWdodGlseS4gVGhlIGFsaWFzIHNldCBzcGxheSB0cmVl cyBjYW4gdGhlb3JldGljYWxseQogICAgIHJlcHJlc2VudCB0aGlzLCBidXQg aW5zZXJ0aW9uIGlzIHRyaWNreSB3aGVuIHlvdSBjb25zaWRlciBhbGwgdGhl CiAgICAgZGlmZmVyZW50IG9yZGVycyB0aGluZ3MgbWlnaHQgYXJyaXZlIGlu LikgKi8KCiAgaWYgKGNfbGFuZ3VhZ2UgIT0gY2xrX2MgfHwgZmxhZ19pc29j OTkpCiAgICByZXR1cm4gLTE7CgogIC8qIFNhdmUgdGltZSBpZiB0aGVyZSdz IG9ubHkgb25lIGlucHV0IGZpbGUuICAqLwogIGlmIChudW1faW5fZm5hbWVz ID09IDEpCiAgICByZXR1cm4gLTE7CgogIC8qIFBvaW50ZXJzIG5lZWQgc3Bl Y2lhbCBoYW5kbGluZyBpZiB0aGV5IHBvaW50IHRvIGFueSB0eXBlIHRoYXQK ICAgICBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nIChiZWxvdykuICAqLwogIGlm IChUUkVFX0NPREUgKHQpID09IFBPSU5URVJfVFlQRSkKICAgIHsKICAgICAg dHJlZSB0MjsKICAgICAgLyogRmluZCBib3R0b20gdHlwZSB1bmRlciBhbnkg bmVzdGVkIFBPSU5URVJzLiAgKi8KICAgICAgZm9yICh0MiA9IFRSRUVfVFlQ RSAodCk7CgkgICBUUkVFX0NPREUgKHQyKSA9PSBQT0lOVEVSX1RZUEU7Cgkg ICB0MiA9IFRSRUVfVFlQRSAodDIpKQoJOwogICAgICBpZiAoVFJFRV9DT0RF ICh0MikgIT0gUkVDT1JEX1RZUEUKCSAgJiYgVFJFRV9DT0RFICh0MikgIT0g RU5VTUVSQUxfVFlQRQoJICAmJiBUUkVFX0NPREUgKHQyKSAhPSBRVUFMX1VO SU9OX1RZUEUKCSAgJiYgVFJFRV9DT0RFICh0MikgIT0gVU5JT05fVFlQRSkK CXJldHVybiAtMTsKICAgICAgaWYgKFRZUEVfU0laRSAodDIpID09IDApCgly ZXR1cm4gLTE7CiAgICB9CiAgLyogVGhlc2UgYXJlIHRoZSBvbmx5IGNhc2Vz IHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KICBpZiAoVFJFRV9D T0RFICh0KSAhPSBSRUNPUkRfVFlQRQogICAgICAmJiBUUkVFX0NPREUgKHQp ICE9IEVOVU1FUkFMX1RZUEUKICAgICAgJiYgVFJFRV9DT0RFICh0KSAhPSBR VUFMX1VOSU9OX1RZUEUKICAgICAgJiYgVFJFRV9DT0RFICh0KSAhPSBVTklP Tl9UWVBFCiAgICAgICYmIFRSRUVfQ09ERSAodCkgIT0gUE9JTlRFUl9UWVBF KQogICAgcmV0dXJuIC0xOwogIC8qIFVuZGVmaW5lZD8gKi8KICBpZiAoVFlQ RV9TSVpFICh0KSA9PSAwKQogICAgcmV0dXJuIC0xOwoKICAvKiBMb29rIHVw IHQgaW4gaGFzaCB0YWJsZS4gIE9ubHkgb25lIG9mIHRoZSBjb21wYXRpYmxl IHR5cGVzIHdpdGhpbiBlYWNoCiAgICAgYWxpYXMgc2V0IGlzIHJlY29yZGVk IGluIHRoZSB0YWJsZS4gICovCiAgaWYgKCF0eXBlX2hhc2hfdGFibGUpCiAg ICB0eXBlX2hhc2hfdGFibGUgPSBodGFiX2NyZWF0ZV9nZ2MgKDEwMjEsIGNf dHlwZV9oYXNoLAoJICAgIChodGFiX2VxKSBsYW5nX2hvb2tzLnR5cGVzX2Nv bXBhdGlibGVfcCwKCSAgICBOVUxMKTsKICBzbG90ID0gaHRhYl9maW5kX3Ns b3QgKHR5cGVfaGFzaF90YWJsZSwgdCwgSU5TRVJUKTsKICBpZiAoKnNsb3Qg IT0gTlVMTCkKICAgIHsKICAgICAgVFlQRV9BTElBU19TRVQgKHQpID0gVFlQ RV9BTElBU19TRVQgKCh0cmVlKSpzbG90KTsKICAgICAgcmV0dXJuIFRZUEVf QUxJQVNfU0VUICgodHJlZSkqc2xvdCk7CiAgICB9CiAgZWxzZQogICAgLyog T3VyIGNhbGxlciB3aWxsIGFzc2lnbiBhbmQgcmVjb3JkIChpbiB0KSBhIG5l dyBhbGlhcyBzZXQ7IGFsbCB3ZSBuZWVkCiAgICAgICB0byBkbyBpcyByZW1l bWJlciB0IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KICAgICpzbG90ID0gdDsK CiAgcmV0dXJuIC0xOwp9CgwKLyogQ29tcHV0ZSB0aGUgdmFsdWUgb2YgJ3Np emVvZiAoVFlQRSknIG9yICdfX2FsaWdub2ZfXyAoVFlQRSknLCB3aGVyZSB0 aGUKICAgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hpY2ggT1BFUkFU T1IgaXMgYmVpbmcgYXBwbGllZC4gIFRoZSBDT01QTEFJTgogICBmbGFnIGNv bnRyb2xzIHdoZXRoZXIgd2Ugc2hvdWxkIGRpYWdub3NlIHBvc3NpYmx5IGls bC1mb3JtZWQKICAgY29uc3RydWN0cyBvciBub3QuICAqLwoKdHJlZQpjX3Np emVvZl9vcl9hbGlnbm9mX3R5cGUgKHRyZWUgdHlwZSwgYm9vbCBpc19zaXpl b2YsIGludCBjb21wbGFpbikKewogIGNvbnN0IGNoYXIgKm9wX25hbWU7CiAg dHJlZSB2YWx1ZSA9IE5VTEw7CiAgZW51bSB0cmVlX2NvZGUgdHlwZV9jb2Rl ID0gVFJFRV9DT0RFICh0eXBlKTsKCiAgb3BfbmFtZSA9IGlzX3NpemVvZiA/ ICJzaXplb2YiIDogIl9fYWxpZ25vZl9fIjsKCiAgaWYgKHR5cGVfY29kZSA9 PSBGVU5DVElPTl9UWVBFKQogICAgewogICAgICBpZiAoaXNfc2l6ZW9mKQoJ ewoJICBpZiAoY29tcGxhaW4gJiYgKHBlZGFudGljIHx8IHdhcm5fcG9pbnRl cl9hcml0aCkpCgkgICAgcGVkd2FybiAoImludmFsaWQgYXBwbGljYXRpb24g b2YgJTxzaXplb2YlPiB0byBhIGZ1bmN0aW9uIHR5cGUiKTsKCSAgdmFsdWUg PSBzaXplX29uZV9ub2RlOwoJfQogICAgICBlbHNlCgl2YWx1ZSA9IHNpemVf aW50IChGVU5DVElPTl9CT1VOREFSWSAvIEJJVFNfUEVSX1VOSVQpOwogICAg fQogIGVsc2UgaWYgKHR5cGVfY29kZSA9PSBWT0lEX1RZUEUgfHwgdHlwZV9j b2RlID09IEVSUk9SX01BUkspCiAgICB7CiAgICAgIGlmICh0eXBlX2NvZGUg PT0gVk9JRF9UWVBFCgkgICYmIGNvbXBsYWluICYmIChwZWRhbnRpYyB8fCB3 YXJuX3BvaW50ZXJfYXJpdGgpKQoJcGVkd2FybiAoImludmFsaWQgYXBwbGlj YXRpb24gb2YgJXFzIHRvIGEgdm9pZCB0eXBlIiwgb3BfbmFtZSk7CiAgICAg IHZhbHVlID0gc2l6ZV9vbmVfbm9kZTsKICAgIH0KICBlbHNlIGlmICghQ09N UExFVEVfVFlQRV9QICh0eXBlKSkKICAgIHsKICAgICAgaWYgKGNvbXBsYWlu KQoJZXJyb3IgKCJpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICVxcyB0byBpbmNv bXBsZXRlIHR5cGUgJXFUICIsCgkgICAgICAgb3BfbmFtZSwgdHlwZSk7CiAg ICAgIHZhbHVlID0gc2l6ZV96ZXJvX25vZGU7CiAgICB9CiAgZWxzZQogICAg ewogICAgICBpZiAoaXNfc2l6ZW9mKQoJLyogQ29udmVydCBpbiBjYXNlIGEg Y2hhciBpcyBtb3JlIHRoYW4gb25lIHVuaXQuICAqLwoJdmFsdWUgPSBzaXpl X2Jpbm9wIChDRUlMX0RJVl9FWFBSLCBUWVBFX1NJWkVfVU5JVCAodHlwZSks CgkJCSAgICBzaXplX2ludCAoVFlQRV9QUkVDSVNJT04gKGNoYXJfdHlwZV9u b2RlKQoJCQkJICAgICAgLyBCSVRTX1BFUl9VTklUKSk7CiAgICAgIGVsc2UK CXZhbHVlID0gc2l6ZV9pbnQgKFRZUEVfQUxJR05fVU5JVCAodHlwZSkpOwog ICAgfQoKICAvKiBWQUxVRSB3aWxsIGhhdmUgYW4gaW50ZWdlciB0eXBlIHdp dGggVFlQRV9JU19TSVpFVFlQRSBzZXQuCiAgICAgVFlQRV9JU19TSVpFVFlQ RSBtZWFucyB0aGF0IGNlcnRhaW4gdGhpbmdzIChsaWtlIG92ZXJmbG93KSB3 aWxsCiAgICAgbmV2ZXIgaGFwcGVuLiAgSG93ZXZlciwgdGhpcyBub2RlIHNo b3VsZCByZWFsbHkgaGF2ZSB0eXBlCiAgICAgYHNpemVfdCcsIHdoaWNoIGlz IGp1c3QgYSB0eXBlZGVmIGZvciBhbiBvcmRpbmFyeSBpbnRlZ2VyIHR5cGUu ICAqLwogIHZhbHVlID0gZm9sZF9jb252ZXJ0IChzaXplX3R5cGVfbm9kZSwg dmFsdWUpOwogIGdjY19hc3NlcnQgKCFUWVBFX0lTX1NJWkVUWVBFIChUUkVF X1RZUEUgKHZhbHVlKSkpOwoKICByZXR1cm4gdmFsdWU7Cn0KCi8qIEltcGxl bWVudCB0aGUgX19hbGlnbm9mIGtleXdvcmQ6IFJldHVybiB0aGUgbWluaW11 bSByZXF1aXJlZAogICBhbGlnbm1lbnQgb2YgRVhQUiwgbWVhc3VyZWQgaW4g Ynl0ZXMuICBGb3IgVkFSX0RFQ0xzLAogICBGVU5DVElPTl9ERUNMcyBhbmQg RklFTERfREVDTHMgcmV0dXJuIERFQ0xfQUxJR04gKHdoaWNoIGNhbiBiZSBz ZXQKICAgZnJvbSBhbiAiYWxpZ25lZCIgX19hdHRyaWJ1dGVfXyBzcGVjaWZp Y2F0aW9uKS4gICovCgp0cmVlCmNfYWxpZ25vZl9leHByICh0cmVlIGV4cHIp CnsKICB0cmVlIHQ7CgogIGlmIChWQVJfT1JfRlVOQ1RJT05fREVDTF9QIChl eHByKSkKICAgIHQgPSBzaXplX2ludCAoREVDTF9BTElHTl9VTklUIChleHBy KSk7CgogIGVsc2UgaWYgKFRSRUVfQ09ERSAoZXhwcikgPT0gQ09NUE9ORU5U X1JFRgoJICAgJiYgREVDTF9DX0JJVF9GSUVMRCAoVFJFRV9PUEVSQU5EIChl eHByLCAxKSkpCiAgICB7CiAgICAgIGVycm9yICgiJTxfX2FsaWdub2YlPiBh cHBsaWVkIHRvIGEgYml0LWZpZWxkIik7CiAgICAgIHQgPSBzaXplX29uZV9u b2RlOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09ERSAoZXhwcikgPT0gQ09N UE9ORU5UX1JFRgoJICAgJiYgVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKGV4 cHIsIDEpKSA9PSBGSUVMRF9ERUNMKQogICAgdCA9IHNpemVfaW50IChERUNM X0FMSUdOX1VOSVQgKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpKTsKCiAgZWxz ZSBpZiAoVFJFRV9DT0RFIChleHByKSA9PSBJTkRJUkVDVF9SRUYpCiAgICB7 CiAgICAgIHRyZWUgdCA9IFRSRUVfT1BFUkFORCAoZXhwciwgMCk7CiAgICAg IHRyZWUgYmVzdCA9IHQ7CiAgICAgIGludCBiZXN0YWxpZ24gPSBUWVBFX0FM SUdOIChUUkVFX1RZUEUgKFRSRUVfVFlQRSAodCkpKTsKCiAgICAgIHdoaWxl ICgoVFJFRV9DT0RFICh0KSA9PSBOT1BfRVhQUiB8fCBUUkVFX0NPREUgKHQp ID09IENPTlZFUlRfRVhQUikKCSAgICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZ UEUgKFRSRUVfT1BFUkFORCAodCwgMCkpKSA9PSBQT0lOVEVSX1RZUEUpCgl7 CgkgIGludCB0aGlzYWxpZ247CgoJICB0ID0gVFJFRV9PUEVSQU5EICh0LCAw KTsKCSAgdGhpc2FsaWduID0gVFlQRV9BTElHTiAoVFJFRV9UWVBFIChUUkVF X1RZUEUgKHQpKSk7CgkgIGlmICh0aGlzYWxpZ24gPiBiZXN0YWxpZ24pCgkg ICAgYmVzdCA9IHQsIGJlc3RhbGlnbiA9IHRoaXNhbGlnbjsKCX0KICAgICAg cmV0dXJuIGNfYWxpZ25vZiAoVFJFRV9UWVBFIChUUkVFX1RZUEUgKGJlc3Qp KSk7CiAgICB9CiAgZWxzZQogICAgcmV0dXJuIGNfYWxpZ25vZiAoVFJFRV9U WVBFIChleHByKSk7CgogIHJldHVybiBmb2xkX2NvbnZlcnQgKHNpemVfdHlw ZV9ub2RlLCB0KTsKfQoMCi8qIEhhbmRsZSBDIGFuZCBDKysgZGVmYXVsdCBh dHRyaWJ1dGVzLiAgKi8KCmVudW0gYnVpbHRfaW5fYXR0cmlidXRlCnsKI2Rl ZmluZSBERUZfQVRUUl9OVUxMX1RSRUUoRU5VTSkgRU5VTSwKI2RlZmluZSBE RUZfQVRUUl9JTlQoRU5VTSwgVkFMVUUpIEVOVU0sCiNkZWZpbmUgREVGX0FU VFJfSURFTlQoRU5VTSwgU1RSSU5HKSBFTlVNLAojZGVmaW5lIERFRl9BVFRS X1RSRUVfTElTVChFTlVNLCBQVVJQT1NFLCBWQUxVRSwgQ0hBSU4pIEVOVU0s CiNpbmNsdWRlICJidWlsdGluLWF0dHJzLmRlZiIKI3VuZGVmIERFRl9BVFRS X05VTExfVFJFRQojdW5kZWYgREVGX0FUVFJfSU5UCiN1bmRlZiBERUZfQVRU Ul9JREVOVAojdW5kZWYgREVGX0FUVFJfVFJFRV9MSVNUCiAgQVRUUl9MQVNU Cn07CgpzdGF0aWMgR1RZKCgpKSB0cmVlIGJ1aWx0X2luX2F0dHJpYnV0ZXNb KGludCkgQVRUUl9MQVNUXTsKCnN0YXRpYyB2b2lkIGNfaW5pdF9hdHRyaWJ1 dGVzICh2b2lkKTsKCmVudW0gY19idWlsdGluX3R5cGUKewojZGVmaW5lIERF Rl9QUklNSVRJVkVfVFlQRShOQU1FLCBWQUxVRSkgTkFNRSwKI2RlZmluZSBE RUZfRlVOQ1RJT05fVFlQRV8wKE5BTUUsIFJFVFVSTikgTkFNRSwKI2RlZmlu ZSBERUZfRlVOQ1RJT05fVFlQRV8xKE5BTUUsIFJFVFVSTiwgQVJHMSkgTkFN RSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV8yKE5BTUUsIFJFVFVSTiwg QVJHMSwgQVJHMikgTkFNRSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV8z KE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMykgTkFNRSwKI2RlZmlu ZSBERUZfRlVOQ1RJT05fVFlQRV80KE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJH MiwgQVJHMywgQVJHNCkgTkFNRSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQ RV81KE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJH NSkgTkFNRSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV82KE5BTUUsIFJF VFVSTiwgQVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNSwgQVJHNikgTkFN RSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV83KE5BTUUsIFJFVFVSTiwg QVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNSwgQVJHNiwgQVJHNykgTkFN RSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV9WQVJfMChOQU1FLCBSRVRV Uk4pIE5BTUUsCiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfVkFSXzEoTkFN RSwgUkVUVVJOLCBBUkcxKSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9U WVBFX1ZBUl8yKE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJHMikgTkFNRSwKI2Rl ZmluZSBERUZfRlVOQ1RJT05fVFlQRV9WQVJfMyhOQU1FLCBSRVRVUk4sIEFS RzEsIEFSRzIsIEFSRzMpIE5BTUUsCiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZ UEVfVkFSXzQoTkFNRSwgUkVUVVJOLCBBUkcxLCBBUkcyLCBBUkczLCBBUkc0 KSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFX1ZBUl81KE5BTUUs IFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNikgXAogIE5B TUUsCiNkZWZpbmUgREVGX1BPSU5URVJfVFlQRShOQU1FLCBUWVBFKSBOQU1F LAojaW5jbHVkZSAiYnVpbHRpbi10eXBlcy5kZWYiCiN1bmRlZiBERUZfUFJJ TUlUSVZFX1RZUEUKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzAKI3VuZGVm IERFRl9GVU5DVElPTl9UWVBFXzEKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBF XzIKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzMKI3VuZGVmIERFRl9GVU5D VElPTl9UWVBFXzQKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzUKI3VuZGVm IERFRl9GVU5DVElPTl9UWVBFXzYKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBF XzcKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8wCiN1bmRlZiBERUZf RlVOQ1RJT05fVFlQRV9WQVJfMQojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVf VkFSXzIKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8zCiN1bmRlZiBE RUZfRlVOQ1RJT05fVFlQRV9WQVJfNAojdW5kZWYgREVGX0ZVTkNUSU9OX1RZ UEVfVkFSXzUKI3VuZGVmIERFRl9QT0lOVEVSX1RZUEUKICBCVF9MQVNUCn07 Cgp0eXBlZGVmIGVudW0gY19idWlsdGluX3R5cGUgYnVpbHRpbl90eXBlOwoK LyogQSB0ZW1wb3JhcnkgYXJyYXkgZm9yIGNfY29tbW9uX25vZGVzX2FuZF9i dWlsdGlucy4gIFVzZWQgaW4KICAgY29tbXVuaWNhdGlvbiB3aXRoIGRlZl9m bl90eXBlLiAgKi8Kc3RhdGljIHRyZWUgYnVpbHRpbl90eXBlc1soaW50KSBC VF9MQVNUICsgMV07CgovKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgY19jb21t b25fbm9kZXNfYW5kX2J1aWx0aW5zLiAgQnVpbGQgZnVuY3Rpb24gdHlwZQog ICBmb3IgREVGIHdpdGggcmV0dXJuIHR5cGUgUkVUIGFuZCBOIGFyZ3VtZW50 cy4gIElmIFZBUiBpcyB0cnVlLCB0aGVuIHRoZQogICBmdW5jdGlvbiBzaG91 bGQgYmUgdmFyaWFkaWMgYWZ0ZXIgdGhvc2UgTiBhcmd1bWVudHMuCgogICBU YWtlcyBzcGVjaWFsIGNhcmUgbm90IHRvIElDRSBpZiBhbnkgb2YgdGhlIHR5 cGVzIGludm9sdmVkIGFyZQogICBlcnJvcl9tYXJrX25vZGUsIHdoaWNoIGlu ZGljYXRlcyB0aGF0IHNhaWQgdHlwZSBpcyBub3QgaW4gZmFjdCBhdmFpbGFi bGUKICAgKHNlZSBidWlsdGluX3R5cGVfZm9yX3NpemUpLiAgSW4gd2hpY2gg Y2FzZSB0aGUgZnVuY3Rpb24gdHlwZSBhcyBhIHdob2xlCiAgIHNob3VsZCBi ZSBlcnJvcl9tYXJrX25vZGUuICAqLwoKc3RhdGljIHZvaWQKZGVmX2ZuX3R5 cGUgKGJ1aWx0aW5fdHlwZSBkZWYsIGJ1aWx0aW5fdHlwZSByZXQsIGJvb2wg dmFyLCBpbnQgbiwgLi4uKQp7CiAgdHJlZSBhcmdzID0gTlVMTCwgdDsKICB2 YV9saXN0IGxpc3Q7CiAgaW50IGk7CgogIHZhX3N0YXJ0IChsaXN0LCBuKTsK ICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQogICAgewogICAgICBidWlsdGlu X3R5cGUgYSA9IHZhX2FyZyAobGlzdCwgYnVpbHRpbl90eXBlKTsKICAgICAg dCA9IGJ1aWx0aW5fdHlwZXNbYV07CiAgICAgIGlmICh0ID09IGVycm9yX21h cmtfbm9kZSkKCWdvdG8gZWdyZXNzOwogICAgICBhcmdzID0gdHJlZV9jb25z IChOVUxMX1RSRUUsIHQsIGFyZ3MpOwogICAgfQogIHZhX2VuZCAobGlzdCk7 CgogIGFyZ3MgPSBucmV2ZXJzZSAoYXJncyk7CiAgaWYgKCF2YXIpCiAgICBh cmdzID0gY2hhaW5vbiAoYXJncywgdm9pZF9saXN0X25vZGUpOwoKICB0ID0g YnVpbHRpbl90eXBlc1tyZXRdOwogIGlmICh0ID09IGVycm9yX21hcmtfbm9k ZSkKICAgIGdvdG8gZWdyZXNzOwogIHQgPSBidWlsZF9mdW5jdGlvbl90eXBl ICh0LCBhcmdzKTsKCiBlZ3Jlc3M6CiAgYnVpbHRpbl90eXBlc1tkZWZdID0g dDsKfQoKLyogQnVpbGQgYnVpbHRpbiBmdW5jdGlvbnMgY29tbW9uIHRvIGJv dGggQyBhbmQgQysrIGxhbmd1YWdlCiAgIGZyb250ZW5kcy4gICovCgpzdGF0 aWMgdm9pZApjX2RlZmluZV9idWlsdGlucyAodHJlZSB2YV9saXN0X3JlZl90 eXBlX25vZGUsIHRyZWUgdmFfbGlzdF9hcmdfdHlwZV9ub2RlKQp7CiNkZWZp bmUgREVGX1BSSU1JVElWRV9UWVBFKEVOVU0sIFZBTFVFKSBcCiAgYnVpbHRp bl90eXBlc1tFTlVNXSA9IFZBTFVFOwojZGVmaW5lIERFRl9GVU5DVElPTl9U WVBFXzAoRU5VTSwgUkVUVVJOKSBcCiAgZGVmX2ZuX3R5cGUgKEVOVU0sIFJF VFVSTiwgMCwgMCk7CiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfMShFTlVN LCBSRVRVUk4sIEFSRzEpIFwKICBkZWZfZm5fdHlwZSAoRU5VTSwgUkVUVVJO LCAwLCAxLCBBUkcxKTsKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV8yKEVO VU0sIFJFVFVSTiwgQVJHMSwgQVJHMikgXAogIGRlZl9mbl90eXBlIChFTlVN LCBSRVRVUk4sIDAsIDIsIEFSRzEsIEFSRzIpOwojZGVmaW5lIERFRl9GVU5D VElPTl9UWVBFXzMoRU5VTSwgUkVUVVJOLCBBUkcxLCBBUkcyLCBBUkczKSBc CiAgZGVmX2ZuX3R5cGUgKEVOVU0sIFJFVFVSTiwgMCwgMywgQVJHMSwgQVJH MiwgQVJHMyk7CiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfNChFTlVNLCBS RVRVUk4sIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQpIFwKICBkZWZfZm5fdHlw ZSAoRU5VTSwgUkVUVVJOLCAwLCA0LCBBUkcxLCBBUkcyLCBBUkczLCBBUkc0 KTsKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV81KEVOVU0sIFJFVFVSTiwg QVJHMSwgQVJHMiwgQVJHMywgQVJHNCwgQVJHNSkJXAogIGRlZl9mbl90eXBl IChFTlVNLCBSRVRVUk4sIDAsIDUsIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQs IEFSRzUpOwojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFXzYoRU5VTSwgUkVU VVJOLCBBUkcxLCBBUkcyLCBBUkczLCBBUkc0LCBBUkc1LCBcCgkJCSAgICBB Ukc2KQkJCQkJXAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRVUk4sIDAsIDYs IEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQsIEFSRzUsIEFSRzYpOwojZGVmaW5l IERFRl9GVU5DVElPTl9UWVBFXzcoRU5VTSwgUkVUVVJOLCBBUkcxLCBBUkcy LCBBUkczLCBBUkc0LCBBUkc1LCBcCgkJCSAgICBBUkc2LCBBUkc3KQkJCQkJ XAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRVUk4sIDAsIDcsIEFSRzEsIEFS RzIsIEFSRzMsIEFSRzQsIEFSRzUsIEFSRzYsIEFSRzcpOwojZGVmaW5lIERF Rl9GVU5DVElPTl9UWVBFX1ZBUl8wKEVOVU0sIFJFVFVSTikgXAogIGRlZl9m bl90eXBlIChFTlVNLCBSRVRVUk4sIDEsIDApOwojZGVmaW5lIERFRl9GVU5D VElPTl9UWVBFX1ZBUl8xKEVOVU0sIFJFVFVSTiwgQVJHMSkgXAogIGRlZl9m bl90eXBlIChFTlVNLCBSRVRVUk4sIDEsIDEsIEFSRzEpOwojZGVmaW5lIERF Rl9GVU5DVElPTl9UWVBFX1ZBUl8yKEVOVU0sIFJFVFVSTiwgQVJHMSwgQVJH MikgXAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRVUk4sIDEsIDIsIEFSRzEs IEFSRzIpOwojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8zKEVOVU0s IFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMykgXAogIGRlZl9mbl90eXBlIChF TlVNLCBSRVRVUk4sIDEsIDMsIEFSRzEsIEFSRzIsIEFSRzMpOwojZGVmaW5l IERFRl9GVU5DVElPTl9UWVBFX1ZBUl80KEVOVU0sIFJFVFVSTiwgQVJHMSwg QVJHMiwgQVJHMywgQVJHNCkgXAogIGRlZl9mbl90eXBlIChFTlVNLCBSRVRV Uk4sIDEsIDQsIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQpOwojZGVmaW5lIERF Rl9GVU5DVElPTl9UWVBFX1ZBUl81KEVOVU0sIFJFVFVSTiwgQVJHMSwgQVJH MiwgQVJHMywgQVJHNCwgQVJHNSkgXAogIGRlZl9mbl90eXBlIChFTlVNLCBS RVRVUk4sIDEsIDUsIEFSRzEsIEFSRzIsIEFSRzMsIEFSRzQsIEFSRzUpOwoj ZGVmaW5lIERFRl9QT0lOVEVSX1RZUEUoRU5VTSwgVFlQRSkgXAogIGJ1aWx0 aW5fdHlwZXNbKGludCkgRU5VTV0gPSBidWlsZF9wb2ludGVyX3R5cGUgKGJ1 aWx0aW5fdHlwZXNbKGludCkgVFlQRV0pOwoKI2luY2x1ZGUgImJ1aWx0aW4t dHlwZXMuZGVmIgoKI3VuZGVmIERFRl9QUklNSVRJVkVfVFlQRQojdW5kZWYg REVGX0ZVTkNUSU9OX1RZUEVfMQojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVf MgojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfMwojdW5kZWYgREVGX0ZVTkNU SU9OX1RZUEVfNAojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfNQojdW5kZWYg REVGX0ZVTkNUSU9OX1RZUEVfNgojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVf VkFSXzAKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8xCiN1bmRlZiBE RUZfRlVOQ1RJT05fVFlQRV9WQVJfMgojdW5kZWYgREVGX0ZVTkNUSU9OX1RZ UEVfVkFSXzMKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl80CiN1bmRl ZiBERUZfRlVOQ1RJT05fVFlQRV9WQVJfNQojdW5kZWYgREVGX1BPSU5URVJf VFlQRQogIGJ1aWx0aW5fdHlwZXNbKGludCkgQlRfTEFTVF0gPSBOVUxMX1RS RUU7CgogIGNfaW5pdF9hdHRyaWJ1dGVzICgpOwoKI2RlZmluZSBERUZfQlVJ TFRJTihFTlVNLCBOQU1FLCBDTEFTUywgVFlQRSwgTElCVFlQRSwgQk9USF9Q LCBGQUxMQkFDS19QLCBcCgkJICAgIE5PTkFOU0lfUCwgQVRUUlMsIElNUExJ Q0lULCBDT05EKQkJCVwKICBpZiAoTkFNRSAmJiBDT05EKQkJCQkJCQlcCiAg ICBkZWZfYnVpbHRpbl8xIChFTlVNLCBOQU1FLCBDTEFTUywgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKCQkgICBidWlsdGluX3R5cGVz WyhpbnQpIFRZUEVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKCQkg ICBidWlsdGluX3R5cGVzWyhpbnQpIExJQlRZUEVdLCAgICAgICAgICAgICAg ICAgICAgICAgIFwKCQkgICBCT1RIX1AsIEZBTExCQUNLX1AsIE5PTkFOU0lf UCwgICAgICAgICAgICAgICAgICAgICAgIFwKCQkgICBidWlsdF9pbl9hdHRy aWJ1dGVzWyhpbnQpIEFUVFJTXSwgSU1QTElDSVQpOwojaW5jbHVkZSAiYnVp bHRpbnMuZGVmIgojdW5kZWYgREVGX0JVSUxUSU4KCiAgdGFyZ2V0bS5pbml0 X2J1aWx0aW5zICgpOwoKICBidWlsZF9jb21tb25fYnVpbHRpbl9ub2RlcyAo KTsKCiAgaWYgKGZsYWdfbXVkZmxhcCkKICAgIG11ZGZsYXBfaW5pdCAoKTsK fQoKLyogQnVpbGQgdHJlZSBub2RlcyBhbmQgYnVpbHRpbiBmdW5jdGlvbnMg Y29tbW9uIHRvIGJvdGggQyBhbmQgQysrIGxhbmd1YWdlCiAgIGZyb250ZW5k cy4gICovCgp2b2lkCmNfY29tbW9uX25vZGVzX2FuZF9idWlsdGlucyAodm9p ZCkKewogIGludCB3Y2hhcl90eXBlX3NpemU7CiAgdHJlZSBhcnJheV9kb21h aW5fdHlwZTsKICB0cmVlIHZhX2xpc3RfcmVmX3R5cGVfbm9kZTsKICB0cmVl IHZhX2xpc3RfYXJnX3R5cGVfbm9kZTsKCiAgLyogRGVmaW5lIGBpbnQnIGFu ZCBgY2hhcicgZmlyc3Qgc28gdGhhdCBkYnggd2lsbCBvdXRwdXQgdGhlbSBm aXJzdC4gICovCiAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX0lOVCwgTlVM TCwgaW50ZWdlcl90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUg KFJJRF9DSEFSLCAiY2hhciIsIGNoYXJfdHlwZV9ub2RlKTsKCiAgLyogYHNp Z25lZCcgaXMgdGhlIHNhbWUgYXMgYGludCcuICBGSVhNRTogdGhlIGRlY2xh cmF0aW9ucyBvZiAic2lnbmVkIiwKICAgICAidW5zaWduZWQgbG9uZyIsICJs b25nIGxvbmcgdW5zaWduZWQiIGFuZCAidW5zaWduZWQgc2hvcnQiIHdlcmUg aW4gQysrCiAgICAgYnV0IG5vdCBDLiAgQXJlIHRoZSBjb25kaXRpb25hbHMg aGVyZSBuZWVkZWQ/ICAqLwogIGlmIChjX2RpYWxlY3RfY3h4ICgpKQogICAg cmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX1NJR05FRCwgTlVMTCwgaW50ZWdl cl90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9MT05H LCAibG9uZyBpbnQiLCBsb25nX2ludGVnZXJfdHlwZV9ub2RlKTsKICByZWNv cmRfYnVpbHRpbl90eXBlIChSSURfVU5TSUdORUQsICJ1bnNpZ25lZCBpbnQi LCB1bnNpZ25lZF90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUg KFJJRF9NQVgsICJsb25nIHVuc2lnbmVkIGludCIsCgkJICAgICAgIGxvbmdf dW5zaWduZWRfdHlwZV9ub2RlKTsKICBpZiAoY19kaWFsZWN0X2N4eCAoKSkK ICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJ1bnNpZ25lZCBs b25nIiwgbG9uZ191bnNpZ25lZF90eXBlX25vZGUpOwogIHJlY29yZF9idWls dGluX3R5cGUgKFJJRF9NQVgsICJsb25nIGxvbmcgaW50IiwKCQkgICAgICAg bG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIsCgkJ ICAgICAgIGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUpOwogIGlmIChj X2RpYWxlY3RfY3h4ICgpKQogICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklE X01BWCwgImxvbmcgbG9uZyB1bnNpZ25lZCIsCgkJCSBsb25nX2xvbmdfdW5z aWduZWRfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURf U0hPUlQsICJzaG9ydCBpbnQiLCBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZSk7 CiAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgInNob3J0IHVuc2ln bmVkIGludCIsCgkJICAgICAgIHNob3J0X3Vuc2lnbmVkX3R5cGVfbm9kZSk7 CiAgaWYgKGNfZGlhbGVjdF9jeHggKCkpCiAgICByZWNvcmRfYnVpbHRpbl90 eXBlIChSSURfTUFYLCAidW5zaWduZWQgc2hvcnQiLAoJCQkgc2hvcnRfdW5z aWduZWRfdHlwZV9ub2RlKTsKCiAgLyogRGVmaW5lIGJvdGggYHNpZ25lZCBj aGFyJyBhbmQgYHVuc2lnbmVkIGNoYXInLiAgKi8KICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAic2lnbmVkIGNoYXIiLCBzaWduZWRfY2hhcl90 eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJ1 bnNpZ25lZCBjaGFyIiwgdW5zaWduZWRfY2hhcl90eXBlX25vZGUpOwoKICAv KiBUaGVzZSBhcmUgdHlwZXMgdGhhdCBjX2NvbW1vbl90eXBlX2Zvcl9zaXpl IGFuZAogICAgIGNfY29tbW9uX3R5cGVfZm9yX21vZGUgdXNlLiAgKi8KICBs YW5nX2hvb2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RF Q0wsIE5VTExfVFJFRSwKCQkJCQkgaW50UUlfdHlwZV9ub2RlKSk7CiAgbGFu Z19ob29rcy5kZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAoVFlQRV9ERUNM LCBOVUxMX1RSRUUsCgkJCQkJIGludEhJX3R5cGVfbm9kZSkpOwogIGxhbmdf aG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwg TlVMTF9UUkVFLAoJCQkJCSBpbnRTSV90eXBlX25vZGUpKTsKICBsYW5nX2hv b2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIE5V TExfVFJFRSwKCQkJCQkgaW50RElfdHlwZV9ub2RlKSk7CiNpZiBIT1NUX0JJ VFNfUEVSX1dJREVfSU5UID49IDY0CiAgaWYgKHRhcmdldG0uc2NhbGFyX21v ZGVfc3VwcG9ydGVkX3AgKFRJbW9kZSkpCiAgICBsYW5nX2hvb2tzLmRlY2xz LnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsCgkJCQkJICAgZ2V0 X2lkZW50aWZpZXIgKCJfX2ludDEyOF90IiksCgkJCQkJICAgaW50VElfdHlw ZV9ub2RlKSk7CiNlbmRpZgogIGxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wg KGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwgTlVMTF9UUkVFLAoJCQkJCSB1bnNp Z25lZF9pbnRRSV90eXBlX25vZGUpKTsKICBsYW5nX2hvb2tzLmRlY2xzLnB1 c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIE5VTExfVFJFRSwKCQkJ CQkgdW5zaWduZWRfaW50SElfdHlwZV9ub2RlKSk7CiAgbGFuZ19ob29rcy5k ZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLCBOVUxMX1RS RUUsCgkJCQkJIHVuc2lnbmVkX2ludFNJX3R5cGVfbm9kZSkpOwogIGxhbmdf aG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwg TlVMTF9UUkVFLAoJCQkJCSB1bnNpZ25lZF9pbnRESV90eXBlX25vZGUpKTsK I2lmIEhPU1RfQklUU19QRVJfV0lERV9JTlQgPj0gNjQKICBpZiAodGFyZ2V0 bS5zY2FsYXJfbW9kZV9zdXBwb3J0ZWRfcCAoVEltb2RlKSkKICAgIGxhbmdf aG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwK CQkJCQkgICBnZXRfaWRlbnRpZmllciAoIl9fdWludDEyOF90IiksCgkJCQkJ ICAgdW5zaWduZWRfaW50VElfdHlwZV9ub2RlKSk7CiNlbmRpZgoKICAvKiBD cmVhdGUgdGhlIHdpZGVzdCBsaXRlcmFsIHR5cGVzLiAgKi8KICB3aWRlc3Rf aW50ZWdlcl9saXRlcmFsX3R5cGVfbm9kZQogICAgPSBtYWtlX3NpZ25lZF90 eXBlIChIT1NUX0JJVFNfUEVSX1dJREVfSU5UICogMik7CiAgbGFuZ19ob29r cy5kZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLCBOVUxM X1RSRUUsCgkJCQkJIHdpZGVzdF9pbnRlZ2VyX2xpdGVyYWxfdHlwZV9ub2Rl KSk7CgogIHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVfbm9kZQogICAg PSBtYWtlX3Vuc2lnbmVkX3R5cGUgKEhPU1RfQklUU19QRVJfV0lERV9JTlQg KiAyKTsKICBsYW5nX2hvb2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNs IChUWVBFX0RFQ0wsIE5VTExfVFJFRSwKCQkJCQkgd2lkZXN0X3Vuc2lnbmVk X2xpdGVyYWxfdHlwZV9ub2RlKSk7CgogIC8qIGB1bnNpZ25lZCBsb25nJyBp cyB0aGUgc3RhbmRhcmQgdHlwZSBmb3Igc2l6ZW9mLgogICAgIE5vdGUgdGhh dCBzdGRkZWYuaCB1c2VzIGB1bnNpZ25lZCBsb25nJywKICAgICBhbmQgdGhp cyBtdXN0IGFncmVlLCBldmVuIGlmIGxvbmcgYW5kIGludCBhcmUgdGhlIHNh bWUgc2l6ZS4gICovCiAgc2l6ZV90eXBlX25vZGUgPQogICAgVFJFRV9UWVBF IChpZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIgKFNJ WkVfVFlQRSkpKTsKICBzaWduZWRfc2l6ZV90eXBlX25vZGUgPSBjX2NvbW1v bl9zaWduZWRfdHlwZSAoc2l6ZV90eXBlX25vZGUpOwogIHNldF9zaXpldHlw ZSAoc2l6ZV90eXBlX25vZGUpOwoKICBwaWRfdHlwZV9ub2RlID0KICAgIFRS RUVfVFlQRSAoaWRlbnRpZmllcl9nbG9iYWxfdmFsdWUgKGdldF9pZGVudGlm aWVyIChQSURfVFlQRSkpKTsKCiAgYnVpbGRfY29tbW9uX3RyZWVfbm9kZXNf MiAoZmxhZ19zaG9ydF9kb3VibGUpOwoKICByZWNvcmRfYnVpbHRpbl90eXBl IChSSURfRkxPQVQsIE5VTEwsIGZsb2F0X3R5cGVfbm9kZSk7CiAgcmVjb3Jk X2J1aWx0aW5fdHlwZSAoUklEX0RPVUJMRSwgTlVMTCwgZG91YmxlX3R5cGVf bm9kZSk7CiAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgImxvbmcg ZG91YmxlIiwgbG9uZ19kb3VibGVfdHlwZV9ub2RlKTsKCiAgLyogT25seSBz dXBwb3J0ZWQgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBleHRlbnNpb24gaWYg dGhlIHRhcmdldAogICAgIGFjdHVhbGx5IHN1cHBvcnRzIHVuZGVybHlpbmcg bW9kZXMuICovCiAgaWYgKHRhcmdldG0uc2NhbGFyX21vZGVfc3VwcG9ydGVk X3AgKFNEbW9kZSkgCiAgICAgICYmIHRhcmdldG0uc2NhbGFyX21vZGVfc3Vw cG9ydGVkX3AgKEREbW9kZSkKICAgICAgJiYgdGFyZ2V0bS5zY2FsYXJfbW9k ZV9zdXBwb3J0ZWRfcCAoVERtb2RlKSkKICAgIHsKICAgICAgcmVjb3JkX2J1 aWx0aW5fdHlwZSAoUklEX0RGTE9BVDMyLCBOVUxMLCBkZmxvYXQzMl90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfREZMT0FU NjQsIE5VTEwsIGRmbG9hdDY0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9i dWlsdGluX3R5cGUgKFJJRF9ERkxPQVQxMjgsIE5VTEwsIGRmbG9hdDEyOF90 eXBlX25vZGUpOwogICAgfQoKICBpZiAodGFyZ2V0bS5maXhlZF9wb2ludF9z dXBwb3J0ZWRfcCAoKSkKICAgIHsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlw ZSAoUklEX01BWCwgInNob3J0IF9GcmFjdCIsIHNob3J0X2ZyYWN0X3R5cGVf bm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9GUkFDVCwg TlVMTCwgZnJhY3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSAoUklEX01BWCwgImxvbmcgX0ZyYWN0IiwgbG9uZ19mcmFjdF90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAi bG9uZyBsb25nIF9GcmFjdCIsCgkJCSAgIGxvbmdfbG9uZ19mcmFjdF90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAi dW5zaWduZWQgc2hvcnQgX0ZyYWN0IiwKCQkJICAgdW5zaWduZWRfc2hvcnRf ZnJhY3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAo UklEX01BWCwgInVuc2lnbmVkIF9GcmFjdCIsCgkJCSAgIHVuc2lnbmVkX2Zy YWN0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJ RF9NQVgsICJ1bnNpZ25lZCBsb25nIF9GcmFjdCIsCgkJCSAgIHVuc2lnbmVk X2xvbmdfZnJhY3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSAoUklEX01BWCwgInVuc2lnbmVkIGxvbmcgbG9uZyBfRnJhY3QiLAoJ CQkgICB1bnNpZ25lZF9sb25nX2xvbmdfZnJhY3RfdHlwZV9ub2RlKTsKICAg ICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgIl9TYXQgc2hvcnQg X0ZyYWN0IiwKCQkJICAgc2F0X3Nob3J0X2ZyYWN0X3R5cGVfbm9kZSk7CiAg ICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJfU2F0IF9GcmFj dCIsIHNhdF9mcmFjdF90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAiX1NhdCBsb25nIF9GcmFjdCIsCgkJCSAgIHNh dF9sb25nX2ZyYWN0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGlu X3R5cGUgKFJJRF9NQVgsICJfU2F0IGxvbmcgbG9uZyBfRnJhY3QiLAoJCQkg ICBzYXRfbG9uZ19sb25nX2ZyYWN0X3R5cGVfbm9kZSk7CiAgICAgIHJlY29y ZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJfU2F0IHVuc2lnbmVkIHNob3J0 IF9GcmFjdCIsCgkJCSAgIHNhdF91bnNpZ25lZF9zaG9ydF9mcmFjdF90eXBl X25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAi X1NhdCB1bnNpZ25lZCBfRnJhY3QiLAoJCQkgICBzYXRfdW5zaWduZWRfZnJh Y3RfdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklE X01BWCwgIl9TYXQgdW5zaWduZWQgbG9uZyBfRnJhY3QiLAoJCQkgICBzYXRf dW5zaWduZWRfbG9uZ19mcmFjdF90eXBlX25vZGUpOwogICAgICByZWNvcmRf YnVpbHRpbl90eXBlIChSSURfTUFYLCAiX1NhdCB1bnNpZ25lZCBsb25nIGxv bmcgX0ZyYWN0IiwKCQkJICAgc2F0X3Vuc2lnbmVkX2xvbmdfbG9uZ19mcmFj dF90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURf TUFYLCAic2hvcnQgX0FjY3VtIiwgc2hvcnRfYWNjdW1fdHlwZV9ub2RlKTsK ICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX0FDQ1VNLCBOVUxMLCBh Y2N1bV90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChS SURfTUFYLCAibG9uZyBfQWNjdW0iLCBsb25nX2FjY3VtX3R5cGVfbm9kZSk7 CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJsb25nIGxv bmcgX0FjY3VtIiwKCQkJICAgbG9uZ19sb25nX2FjY3VtX3R5cGVfbm9kZSk7 CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJ1bnNpZ25l ZCBzaG9ydCBfQWNjdW0iLAoJCQkgICB1bnNpZ25lZF9zaG9ydF9hY2N1bV90 eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFY LCAidW5zaWduZWQgX0FjY3VtIiwKCQkJICAgdW5zaWduZWRfYWNjdW1fdHlw ZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwg InVuc2lnbmVkIGxvbmcgX0FjY3VtIiwKCQkJICAgdW5zaWduZWRfbG9uZ19h Y2N1bV90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRpbl90eXBlIChS SURfTUFYLCAidW5zaWduZWQgbG9uZyBsb25nIF9BY2N1bSIsCgkJCSAgIHVu c2lnbmVkX2xvbmdfbG9uZ19hY2N1bV90eXBlX25vZGUpOwogICAgICByZWNv cmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAiX1NhdCBzaG9ydCBfQWNjdW0i LAoJCQkgICBzYXRfc2hvcnRfYWNjdW1fdHlwZV9ub2RlKTsKICAgICAgcmVj b3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgIl9TYXQgX0FjY3VtIiwgc2F0 X2FjY3VtX3R5cGVfbm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUg KFJJRF9NQVgsICJfU2F0IGxvbmcgX0FjY3VtIiwKCQkJICAgc2F0X2xvbmdf YWNjdW1fdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAo UklEX01BWCwgIl9TYXQgbG9uZyBsb25nIF9BY2N1bSIsCgkJCSAgc2F0X2xv bmdfbG9uZ19hY2N1bV90eXBlX25vZGUpOwogICAgICByZWNvcmRfYnVpbHRp bl90eXBlIChSSURfTUFYLCAiX1NhdCB1bnNpZ25lZCBzaG9ydCBfQWNjdW0i LAoJCQkgICBzYXRfdW5zaWduZWRfc2hvcnRfYWNjdW1fdHlwZV9ub2RlKTsK ICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX01BWCwgIl9TYXQgdW5z aWduZWQgX0FjY3VtIiwKCQkJICAgc2F0X3Vuc2lnbmVkX2FjY3VtX3R5cGVf bm9kZSk7CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJf U2F0IHVuc2lnbmVkIGxvbmcgX0FjY3VtIiwKCQkJICAgc2F0X3Vuc2lnbmVk X2xvbmdfYWNjdW1fdHlwZV9ub2RlKTsKICAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSAoUklEX01BWCwgIl9TYXQgdW5zaWduZWQgbG9uZyBsb25nIF9BY2N1 bSIsCgkJCSAgIHNhdF91bnNpZ25lZF9sb25nX2xvbmdfYWNjdW1fdHlwZV9u b2RlKTsKCiAgICB9CgogIGxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wgKGJ1 aWxkX2RlY2wgKFRZUEVfREVDTCwKCQkJCQkgZ2V0X2lkZW50aWZpZXIgKCJj b21wbGV4IGludCIpLAoJCQkJCSBjb21wbGV4X2ludGVnZXJfdHlwZV9ub2Rl KSk7CiAgbGFuZ19ob29rcy5kZWNscy5wdXNoZGVjbCAoYnVpbGRfZGVjbCAo VFlQRV9ERUNMLAoJCQkJCSBnZXRfaWRlbnRpZmllciAoImNvbXBsZXggZmxv YXQiKSwKCQkJCQkgY29tcGxleF9mbG9hdF90eXBlX25vZGUpKTsKICBsYW5n X2hvb2tzLmRlY2xzLnB1c2hkZWNsIChidWlsZF9kZWNsIChUWVBFX0RFQ0ws CgkJCQkJIGdldF9pZGVudGlmaWVyICgiY29tcGxleCBkb3VibGUiKSwKCQkJ CQkgY29tcGxleF9kb3VibGVfdHlwZV9ub2RlKSk7CiAgbGFuZ19ob29rcy5k ZWNscy5wdXNoZGVjbAogICAgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwgZ2V0 X2lkZW50aWZpZXIgKCJjb21wbGV4IGxvbmcgZG91YmxlIiksCgkJIGNvbXBs ZXhfbG9uZ19kb3VibGVfdHlwZV9ub2RlKSk7CgogIGlmIChjX2RpYWxlY3Rf Y3h4ICgpKQogICAgLyogRm9yIEMrKywgbWFrZSBmaWxlcHRyX3R5cGVfbm9k ZSBhIGRpc3RpbmN0IHZvaWQgKiB0eXBlIHVudGlsCiAgICAgICBGSUxFIHR5 cGUgaXMgZGVmaW5lZC4gICovCiAgICBmaWxlcHRyX3R5cGVfbm9kZSA9IGJ1 aWxkX3ZhcmlhbnRfdHlwZV9jb3B5IChwdHJfdHlwZV9ub2RlKTsKCiAgcmVj b3JkX2J1aWx0aW5fdHlwZSAoUklEX1ZPSUQsIE5VTEwsIHZvaWRfdHlwZV9u b2RlKTsKCiAgLyogU2V0IHRoZSBUWVBFX05BTUUgZm9yIGFueSB2YXJpYW50 cyB0aGF0IHdlcmUgYnVpbHQgYmVmb3JlCiAgICAgcmVjb3JkX2J1aWx0aW5f dHlwZSBnYXZlIG5hbWVzIHRvIHRoZSBidWlsdC1pbiB0eXBlcy4gKi8KICB7 CiAgICB0cmVlIHZvaWRfbmFtZSA9IFRZUEVfTkFNRSAodm9pZF90eXBlX25v ZGUpOwogICAgVFlQRV9OQU1FICh2b2lkX3R5cGVfbm9kZSkgPSBOVUxMX1RS RUU7CiAgICBUWVBFX05BTUUgKGJ1aWxkX3F1YWxpZmllZF90eXBlICh2b2lk X3R5cGVfbm9kZSwgVFlQRV9RVUFMX0NPTlNUKSkKICAgICAgPSB2b2lkX25h bWU7CiAgICBUWVBFX05BTUUgKHZvaWRfdHlwZV9ub2RlKSA9IHZvaWRfbmFt ZTsKICB9CgogIC8qIFRoaXMgbm9kZSBtdXN0IG5vdCBiZSBzaGFyZWQuICAq LwogIHZvaWRfemVyb19ub2RlID0gbWFrZV9ub2RlIChJTlRFR0VSX0NTVCk7 CiAgVFJFRV9UWVBFICh2b2lkX3plcm9fbm9kZSkgPSB2b2lkX3R5cGVfbm9k ZTsKCiAgdm9pZF9saXN0X25vZGUgPSBidWlsZF92b2lkX2xpc3Rfbm9kZSAo KTsKCiAgLyogTWFrZSBhIHR5cGUgdG8gYmUgdGhlIGRvbWFpbiBvZiBhIGZl dyBhcnJheSB0eXBlcwogICAgIHdob3NlIGRvbWFpbnMgZG9uJ3QgcmVhbGx5 IG1hdHRlci4KICAgICAyMDAgaXMgc21hbGwgZW5vdWdoIHRoYXQgaXQgYWx3 YXlzIGZpdHMgaW4gc2l6ZV90CiAgICAgYW5kIGxhcmdlIGVub3VnaCB0aGF0 IGl0IGNhbiBob2xkIG1vc3QgZnVuY3Rpb24gbmFtZXMgZm9yIHRoZQogICAg IGluaXRpYWxpemF0aW9ucyBvZiBfX0ZVTkNUSU9OX18gYW5kIF9fUFJFVFRZ X0ZVTkNUSU9OX18uICAqLwogIGFycmF5X2RvbWFpbl90eXBlID0gYnVpbGRf aW5kZXhfdHlwZSAoc2l6ZV9pbnQgKDIwMCkpOwoKICAvKiBNYWtlIGEgdHlw ZSBmb3IgYXJyYXlzIG9mIGNoYXJhY3RlcnMuCiAgICAgV2l0aCBsdWNrIG5v dGhpbmcgd2lsbCBldmVyIHJlYWxseSBkZXBlbmQgb24gdGhlIGxlbmd0aCBv ZiB0aGlzCiAgICAgYXJyYXkgdHlwZS4gICovCiAgY2hhcl9hcnJheV90eXBl X25vZGUKICAgID0gYnVpbGRfYXJyYXlfdHlwZSAoY2hhcl90eXBlX25vZGUs IGFycmF5X2RvbWFpbl90eXBlKTsKCiAgLyogTGlrZXdpc2UgZm9yIGFycmF5 cyBvZiBpbnRzLiAgKi8KICBpbnRfYXJyYXlfdHlwZV9ub2RlCiAgICA9IGJ1 aWxkX2FycmF5X3R5cGUgKGludGVnZXJfdHlwZV9ub2RlLCBhcnJheV9kb21h aW5fdHlwZSk7CgogIHN0cmluZ190eXBlX25vZGUgPSBidWlsZF9wb2ludGVy X3R5cGUgKGNoYXJfdHlwZV9ub2RlKTsKICBjb25zdF9zdHJpbmdfdHlwZV9u b2RlCiAgICA9IGJ1aWxkX3BvaW50ZXJfdHlwZSAoYnVpbGRfcXVhbGlmaWVk X3R5cGUKCQkJICAoY2hhcl90eXBlX25vZGUsIFRZUEVfUVVBTF9DT05TVCkp OwoKICAvKiBUaGlzIGlzIHNwZWNpYWwgZm9yIEMrKyBzbyBmdW5jdGlvbnMg Y2FuIGJlIG92ZXJsb2FkZWQuICAqLwogIHdjaGFyX3R5cGVfbm9kZSA9IGdl dF9pZGVudGlmaWVyIChNT0RJRklFRF9XQ0hBUl9UWVBFKTsKICB3Y2hhcl90 eXBlX25vZGUgPSBUUkVFX1RZUEUgKGlkZW50aWZpZXJfZ2xvYmFsX3ZhbHVl ICh3Y2hhcl90eXBlX25vZGUpKTsKICB3Y2hhcl90eXBlX3NpemUgPSBUWVBF X1BSRUNJU0lPTiAod2NoYXJfdHlwZV9ub2RlKTsKICBpZiAoY19kaWFsZWN0 X2N4eCAoKSkKICAgIHsKICAgICAgaWYgKFRZUEVfVU5TSUdORUQgKHdjaGFy X3R5cGVfbm9kZSkpCgl3Y2hhcl90eXBlX25vZGUgPSBtYWtlX3Vuc2lnbmVk X3R5cGUgKHdjaGFyX3R5cGVfc2l6ZSk7CiAgICAgIGVsc2UKCXdjaGFyX3R5 cGVfbm9kZSA9IG1ha2Vfc2lnbmVkX3R5cGUgKHdjaGFyX3R5cGVfc2l6ZSk7 CiAgICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9XQ0hBUiwgIndjaGFy X3QiLCB3Y2hhcl90eXBlX25vZGUpOwogICAgfQogIGVsc2UKICAgIHsKICAg ICAgc2lnbmVkX3djaGFyX3R5cGVfbm9kZSA9IGNfY29tbW9uX3NpZ25lZF90 eXBlICh3Y2hhcl90eXBlX25vZGUpOwogICAgICB1bnNpZ25lZF93Y2hhcl90 eXBlX25vZGUgPSBjX2NvbW1vbl91bnNpZ25lZF90eXBlICh3Y2hhcl90eXBl X25vZGUpOwogICAgfQoKICAvKiBUaGlzIGlzIGZvciB3aWRlIHN0cmluZyBj b25zdGFudHMuICAqLwogIHdjaGFyX2FycmF5X3R5cGVfbm9kZQogICAgPSBi dWlsZF9hcnJheV90eXBlICh3Y2hhcl90eXBlX25vZGUsIGFycmF5X2RvbWFp bl90eXBlKTsKCiAgd2ludF90eXBlX25vZGUgPQogICAgVFJFRV9UWVBFIChp ZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIgKFdJTlRf VFlQRSkpKTsKCiAgaW50bWF4X3R5cGVfbm9kZSA9CiAgICBUUkVFX1RZUEUg KGlkZW50aWZpZXJfZ2xvYmFsX3ZhbHVlIChnZXRfaWRlbnRpZmllciAoSU5U TUFYX1RZUEUpKSk7CiAgdWludG1heF90eXBlX25vZGUgPQogICAgVFJFRV9U WVBFIChpZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIg KFVJTlRNQVhfVFlQRSkpKTsKCiAgZGVmYXVsdF9mdW5jdGlvbl90eXBlID0g YnVpbGRfZnVuY3Rpb25fdHlwZSAoaW50ZWdlcl90eXBlX25vZGUsIE5VTExf VFJFRSk7CiAgcHRyZGlmZl90eXBlX25vZGUKICAgID0gVFJFRV9UWVBFIChp ZGVudGlmaWVyX2dsb2JhbF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIgKFBUUkRJ RkZfVFlQRSkpKTsKICB1bnNpZ25lZF9wdHJkaWZmX3R5cGVfbm9kZSA9IGNf Y29tbW9uX3Vuc2lnbmVkX3R5cGUgKHB0cmRpZmZfdHlwZV9ub2RlKTsKCiAg bGFuZ19ob29rcy5kZWNscy5wdXNoZGVjbAogICAgKGJ1aWxkX2RlY2wgKFRZ UEVfREVDTCwgZ2V0X2lkZW50aWZpZXIgKCJfX2J1aWx0aW5fdmFfbGlzdCIp LAoJCSB2YV9saXN0X3R5cGVfbm9kZSkpOwoKICBpZiAoVFJFRV9DT0RFICh2 YV9saXN0X3R5cGVfbm9kZSkgPT0gQVJSQVlfVFlQRSkKICAgIHsKICAgICAg dmFfbGlzdF9hcmdfdHlwZV9ub2RlID0gdmFfbGlzdF9yZWZfdHlwZV9ub2Rl ID0KCWJ1aWxkX3BvaW50ZXJfdHlwZSAoVFJFRV9UWVBFICh2YV9saXN0X3R5 cGVfbm9kZSkpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgdmFfbGlzdF9h cmdfdHlwZV9ub2RlID0gdmFfbGlzdF90eXBlX25vZGU7CiAgICAgIHZhX2xp c3RfcmVmX3R5cGVfbm9kZSA9IGJ1aWxkX3JlZmVyZW5jZV90eXBlICh2YV9s aXN0X3R5cGVfbm9kZSk7CiAgICB9CgogIGlmICghZmxhZ19wcmVwcm9jZXNz X29ubHkpCiAgICBjX2RlZmluZV9idWlsdGlucyAodmFfbGlzdF9yZWZfdHlw ZV9ub2RlLCB2YV9saXN0X2FyZ190eXBlX25vZGUpOwoKICBtYWluX2lkZW50 aWZpZXJfbm9kZSA9IGdldF9pZGVudGlmaWVyICgibWFpbiIpOwoKICAvKiBD cmVhdGUgdGhlIGJ1aWx0LWluIF9fbnVsbCBub2RlLiAgSXQgaXMgaW1wb3J0 YW50IHRoYXQgdGhpcyBpcwogICAgIG5vdCBzaGFyZWQuICAqLwogIG51bGxf bm9kZSA9IG1ha2Vfbm9kZSAoSU5URUdFUl9DU1QpOwogIFRSRUVfVFlQRSAo bnVsbF9ub2RlKSA9IGNfY29tbW9uX3R5cGVfZm9yX3NpemUgKFBPSU5URVJf U0laRSwgMCk7CgogIC8qIFNpbmNlIGJ1aWx0aW5fdHlwZXMgaXNuJ3QgZ2Mn ZWQsIGRvbid0IGV4cG9ydCB0aGVzZSBub2Rlcy4gICovCiAgbWVtc2V0IChi dWlsdGluX3R5cGVzLCAwLCBzaXplb2YgKGJ1aWx0aW5fdHlwZXMpKTsKfQoK LyogTG9vayB1cCB0aGUgZnVuY3Rpb24gaW4gYnVpbHRfaW5fZGVjbHMgdGhh dCBjb3JyZXNwb25kcyB0byBERUNMCiAgIGFuZCBzZXQgQVNNU1BFQyBhcyBp dHMgdXNlciBhc3NlbWJsZXIgbmFtZS4gIERFQ0wgbXVzdCBiZSBhCiAgIGZ1 bmN0aW9uIGRlY2wgdGhhdCBkZWNsYXJlcyBhIGJ1aWx0aW4uICAqLwoKdm9p ZApzZXRfYnVpbHRpbl91c2VyX2Fzc2VtYmxlcl9uYW1lICh0cmVlIGRlY2ws IGNvbnN0IGNoYXIgKmFzbXNwZWMpCnsKICB0cmVlIGJ1aWx0aW47CiAgZ2Nj X2Fzc2VydCAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCgkg ICAgICAmJiBERUNMX0JVSUxUX0lOX0NMQVNTIChkZWNsKSA9PSBCVUlMVF9J Tl9OT1JNQUwKCSAgICAgICYmIGFzbXNwZWMgIT0gMCk7CgogIGJ1aWx0aW4g PSBidWlsdF9pbl9kZWNscyBbREVDTF9GVU5DVElPTl9DT0RFIChkZWNsKV07 CiAgc2V0X3VzZXJfYXNzZW1ibGVyX25hbWUgKGJ1aWx0aW4sIGFzbXNwZWMp OwogIGlmIChERUNMX0ZVTkNUSU9OX0NPREUgKGRlY2wpID09IEJVSUxUX0lO X01FTUNQWSkKICAgIGluaXRfYmxvY2tfbW92ZV9mbiAoYXNtc3BlYyk7CiAg ZWxzZSBpZiAoREVDTF9GVU5DVElPTl9DT0RFIChkZWNsKSA9PSBCVUlMVF9J Tl9NRU1TRVQpCiAgICBpbml0X2Jsb2NrX2NsZWFyX2ZuIChhc21zcGVjKTsK fQoKLyogVGhlIG51bWJlciBvZiBuYW1lZCBjb21wb3VuZC1saXRlcmFscyBn ZW5lcmF0ZWQgdGh1cyBmYXIuICAqLwpzdGF0aWMgR1RZKCgpKSBpbnQgY29t cG91bmRfbGl0ZXJhbF9udW1iZXI7CgovKiBTZXQgREVDTF9OQU1FIGZvciBE RUNMLCBhIFZBUl9ERUNMIGZvciBhIGNvbXBvdW5kLWxpdGVyYWwuICAqLwoK dm9pZApzZXRfY29tcG91bmRfbGl0ZXJhbF9uYW1lICh0cmVlIGRlY2wpCnsK ICBjaGFyICpuYW1lOwogIEFTTV9GT1JNQVRfUFJJVkFURV9OQU1FIChuYW1l LCAiX19jb21wb3VuZF9saXRlcmFsIiwKCQkJICAgY29tcG91bmRfbGl0ZXJh bF9udW1iZXIpOwogIGNvbXBvdW5kX2xpdGVyYWxfbnVtYmVyKys7CiAgREVD TF9OQU1FIChkZWNsKSA9IGdldF9pZGVudGlmaWVyIChuYW1lKTsKfQoKdHJl ZQpidWlsZF92YV9hcmcgKHRyZWUgZXhwciwgdHJlZSB0eXBlKQp7CiAgcmV0 dXJuIGJ1aWxkMSAoVkFfQVJHX0VYUFIsIHR5cGUsIGV4cHIpOwp9CgoKLyog TGlua2VkIGxpc3Qgb2YgZGlzYWJsZWQgYnVpbHQtaW4gZnVuY3Rpb25zLiAg Ki8KCnR5cGVkZWYgc3RydWN0IGRpc2FibGVkX2J1aWx0aW4KewogIGNvbnN0 IGNoYXIgKm5hbWU7CiAgc3RydWN0IGRpc2FibGVkX2J1aWx0aW4gKm5leHQ7 Cn0gZGlzYWJsZWRfYnVpbHRpbjsKc3RhdGljIGRpc2FibGVkX2J1aWx0aW4g KmRpc2FibGVkX2J1aWx0aW5zID0gTlVMTDsKCnN0YXRpYyBib29sIGJ1aWx0 aW5fZnVuY3Rpb25fZGlzYWJsZWRfcCAoY29uc3QgY2hhciAqKTsKCi8qIERp c2FibGUgYSBidWlsdC1pbiBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgLWZuby1i dWlsdGluLU5BTUUuICBJZiBOQU1FCiAgIGJlZ2lucyB3aXRoICJfX2J1aWx0 aW5fIiwgZ2l2ZSBhbiBlcnJvci4gICovCgp2b2lkCmRpc2FibGVfYnVpbHRp bl9mdW5jdGlvbiAoY29uc3QgY2hhciAqbmFtZSkKewogIGlmIChzdHJuY21w IChuYW1lLCAiX19idWlsdGluXyIsIHN0cmxlbiAoIl9fYnVpbHRpbl8iKSkg PT0gMCkKICAgIGVycm9yICgiY2Fubm90IGRpc2FibGUgYnVpbHQtaW4gZnVu Y3Rpb24gJXFzIiwgbmFtZSk7CiAgZWxzZQogICAgewogICAgICBkaXNhYmxl ZF9idWlsdGluICpuZXdfZGlzYWJsZWRfYnVpbHRpbiA9IFhORVcgKGRpc2Fi bGVkX2J1aWx0aW4pOwogICAgICBuZXdfZGlzYWJsZWRfYnVpbHRpbi0+bmFt ZSA9IG5hbWU7CiAgICAgIG5ld19kaXNhYmxlZF9idWlsdGluLT5uZXh0ID0g ZGlzYWJsZWRfYnVpbHRpbnM7CiAgICAgIGRpc2FibGVkX2J1aWx0aW5zID0g bmV3X2Rpc2FibGVkX2J1aWx0aW47CiAgICB9Cn0KCgovKiBSZXR1cm4gdHJ1 ZSBpZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gTkFNRSBoYXMgYmVlbiBkaXNh YmxlZCwgZmFsc2UKICAgb3RoZXJ3aXNlLiAgKi8KCnN0YXRpYyBib29sCmJ1 aWx0aW5fZnVuY3Rpb25fZGlzYWJsZWRfcCAoY29uc3QgY2hhciAqbmFtZSkK ewogIGRpc2FibGVkX2J1aWx0aW4gKnA7CiAgZm9yIChwID0gZGlzYWJsZWRf YnVpbHRpbnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCiAgICB7CiAgICAg IGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCglyZXR1cm4gdHJ1 ZTsKICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCgovKiBXb3JrZXIgZm9yIERF Rl9CVUlMVElOLgogICBQb3NzaWJseSBkZWZpbmUgYSBidWlsdGluIGZ1bmN0 aW9uIHdpdGggb25lIG9yIHR3byBuYW1lcy4KICAgRG9lcyBub3QgZGVjbGFy ZSBhIG5vbi1fX2J1aWx0aW5fIGZ1bmN0aW9uIGlmIGZsYWdfbm9fYnVpbHRp biwgb3IgaWYKICAgbm9uYW5zaV9wIGFuZCBmbGFnX25vX25vbmFuc2lfYnVp bHRpbi4gICovCgpzdGF0aWMgdm9pZApkZWZfYnVpbHRpbl8xIChlbnVtIGJ1 aWx0X2luX2Z1bmN0aW9uIGZuY29kZSwKCSAgICAgICBjb25zdCBjaGFyICpu YW1lLAoJICAgICAgIGVudW0gYnVpbHRfaW5fY2xhc3MgZm5jbGFzcywKCSAg ICAgICB0cmVlIGZudHlwZSwgdHJlZSBsaWJ0eXBlLAoJICAgICAgIGJvb2wg Ym90aF9wLCBib29sIGZhbGxiYWNrX3AsIGJvb2wgbm9uYW5zaV9wLAoJICAg ICAgIHRyZWUgZm5hdHRycywgYm9vbCBpbXBsaWNpdF9wKQp7CiAgdHJlZSBk ZWNsOwogIGNvbnN0IGNoYXIgKmxpYm5hbWU7CgogIGlmIChmbnR5cGUgPT0g ZXJyb3JfbWFya19ub2RlKQogICAgcmV0dXJuOwoKICBnY2NfYXNzZXJ0ICgo IWJvdGhfcCAmJiAhZmFsbGJhY2tfcCkKCSAgICAgIHx8ICFzdHJuY21wIChu YW1lLCAiX19idWlsdGluXyIsCgkJCSAgIHN0cmxlbiAoIl9fYnVpbHRpbl8i KSkpOwoKICBsaWJuYW1lID0gbmFtZSArIHN0cmxlbiAoIl9fYnVpbHRpbl8i KTsKICBkZWNsID0gYWRkX2J1aWx0aW5fZnVuY3Rpb24gKG5hbWUsIGZudHlw ZSwgZm5jb2RlLCBmbmNsYXNzLAoJCQkgICAgICAgKGZhbGxiYWNrX3AgPyBs aWJuYW1lIDogTlVMTCksCgkJCSAgICAgICBmbmF0dHJzKTsKICBpZiAoYm90 aF9wCiAgICAgICYmICFmbGFnX25vX2J1aWx0aW4gJiYgIWJ1aWx0aW5fZnVu Y3Rpb25fZGlzYWJsZWRfcCAobGlibmFtZSkKICAgICAgJiYgIShub25hbnNp X3AgJiYgZmxhZ19ub19ub25hbnNpX2J1aWx0aW4pKQogICAgYWRkX2J1aWx0 aW5fZnVuY3Rpb24gKGxpYm5hbWUsIGxpYnR5cGUsIGZuY29kZSwgZm5jbGFz cywKCQkJICBOVUxMLCBmbmF0dHJzKTsKCiAgYnVpbHRfaW5fZGVjbHNbKGlu dCkgZm5jb2RlXSA9IGRlY2w7CiAgaWYgKGltcGxpY2l0X3ApCiAgICBpbXBs aWNpdF9idWlsdF9pbl9kZWNsc1soaW50KSBmbmNvZGVdID0gZGVjbDsKfQoM Ci8qIE5vbnplcm8gaWYgdGhlIHR5cGUgVCBwcm9tb3RlcyB0byBpbnQuICBU aGlzIGlzIChuZWFybHkpIHRoZQogICBpbnRlZ3JhbCBwcm9tb3Rpb25zIGRl ZmluZWQgaW4gSVNPIEM5OSA2LjMuMS4xLzIuICAqLwoKYm9vbApjX3Byb21v dGluZ19pbnRlZ2VyX3R5cGVfcCAoY29uc3RfdHJlZSB0KQp7CiAgc3dpdGNo IChUUkVFX0NPREUgKHQpKQogICAgewogICAgY2FzZSBJTlRFR0VSX1RZUEU6 CiAgICAgIHJldHVybiAoVFlQRV9NQUlOX1ZBUklBTlQgKHQpID09IGNoYXJf dHlwZV9ub2RlCgkgICAgICB8fCBUWVBFX01BSU5fVkFSSUFOVCAodCkgPT0g c2lnbmVkX2NoYXJfdHlwZV9ub2RlCgkgICAgICB8fCBUWVBFX01BSU5fVkFS SUFOVCAodCkgPT0gdW5zaWduZWRfY2hhcl90eXBlX25vZGUKCSAgICAgIHx8 IFRZUEVfTUFJTl9WQVJJQU5UICh0KSA9PSBzaG9ydF9pbnRlZ2VyX3R5cGVf bm9kZQoJICAgICAgfHwgVFlQRV9NQUlOX1ZBUklBTlQgKHQpID09IHNob3J0 X3Vuc2lnbmVkX3R5cGVfbm9kZQoJICAgICAgfHwgVFlQRV9QUkVDSVNJT04g KHQpIDwgVFlQRV9QUkVDSVNJT04gKGludGVnZXJfdHlwZV9ub2RlKSk7Cgog ICAgY2FzZSBFTlVNRVJBTF9UWVBFOgogICAgICAvKiA/Pz8gVGVjaG5pY2Fs bHkgYWxsIGVudW1lcmF0aW9ucyBub3QgbGFyZ2VyIHRoYW4gYW4gaW50Cgkg cHJvbW90ZSB0byBhbiBpbnQuICBCdXQgdGhpcyBpcyB1c2VkIGFsb25nIGNv ZGUgcGF0aHMKCSB0aGF0IG9ubHkgd2FudCB0byBub3RpY2UgYSBzaXplIGNo YW5nZS4gICovCiAgICAgIHJldHVybiBUWVBFX1BSRUNJU0lPTiAodCkgPCBU WVBFX1BSRUNJU0lPTiAoaW50ZWdlcl90eXBlX25vZGUpOwoKICAgIGNhc2Ug Qk9PTEVBTl9UWVBFOgogICAgICByZXR1cm4gMTsKCiAgICBkZWZhdWx0Ogog ICAgICByZXR1cm4gMDsKICAgIH0KfQoKLyogUmV0dXJuIDEgaWYgUEFSTVMg c3BlY2lmaWVzIGEgZml4ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgYW5k IG5vbmUgb2YgdGhlaXIgdHlwZXMgaXMgYWZmZWN0ZWQgYnkgZGVmYXVsdCBw cm9tb3Rpb25zLiAgKi8KCmludApzZWxmX3Byb21vdGluZ19hcmdzX3AgKGNv bnN0X3RyZWUgcGFybXMpCnsKICBjb25zdF90cmVlIHQ7CiAgZm9yICh0ID0g cGFybXM7IHQ7IHQgPSBUUkVFX0NIQUlOICh0KSkKICAgIHsKICAgICAgdHJl ZSB0eXBlID0gVFJFRV9WQUxVRSAodCk7CgogICAgICBpZiAodHlwZSA9PSBl cnJvcl9tYXJrX25vZGUpCgljb250aW51ZTsKCiAgICAgIGlmIChUUkVFX0NI QUlOICh0KSA9PSAwICYmIHR5cGUgIT0gdm9pZF90eXBlX25vZGUpCglyZXR1 cm4gMDsKCiAgICAgIGlmICh0eXBlID09IDApCglyZXR1cm4gMDsKCiAgICAg IGlmIChUWVBFX01BSU5fVkFSSUFOVCAodHlwZSkgPT0gZmxvYXRfdHlwZV9u b2RlKQoJcmV0dXJuIDA7CgogICAgICBpZiAoY19wcm9tb3RpbmdfaW50ZWdl cl90eXBlX3AgKHR5cGUpKQoJcmV0dXJuIDA7CiAgICB9CiAgcmV0dXJuIDE7 Cn0KCi8qIFJlY3Vyc2l2ZWx5IGV4YW1pbmVzIHRoZSBhcnJheSBlbGVtZW50 cyBvZiBUWVBFLCB1bnRpbCBhIG5vbi1hcnJheQogICBlbGVtZW50IHR5cGUg aXMgZm91bmQuICAqLwoKdHJlZQpzdHJpcF9hcnJheV90eXBlcyAodHJlZSB0 eXBlKQp7CiAgd2hpbGUgKFRSRUVfQ09ERSAodHlwZSkgPT0gQVJSQVlfVFlQ RSkKICAgIHR5cGUgPSBUUkVFX1RZUEUgKHR5cGUpOwoKICByZXR1cm4gdHlw ZTsKfQoKLyogUmVjdXJzaXZlbHkgcmVtb3ZlIGFueSAnKicgb3IgJyYnIG9w ZXJhdG9yIGZyb20gVFlQRS4gICovCnRyZWUKc3RyaXBfcG9pbnRlcl9vcGVy YXRvciAodHJlZSB0KQp7CiAgd2hpbGUgKFBPSU5URVJfVFlQRV9QICh0KSkK ICAgIHQgPSBUUkVFX1RZUEUgKHQpOwogIHJldHVybiB0Owp9CgovKiBSZWN1 cnNpdmVseSByZW1vdmUgcG9pbnRlciBvciBhcnJheSB0eXBlIGZyb20gVFlQ RS4gKi8KdHJlZQpzdHJpcF9wb2ludGVyX29yX2FycmF5X3R5cGVzICh0cmVl IHQpCnsKICB3aGlsZSAoVFJFRV9DT0RFICh0KSA9PSBBUlJBWV9UWVBFIHx8 IFBPSU5URVJfVFlQRV9QICh0KSkKICAgIHQgPSBUUkVFX1RZUEUgKHQpOwog IHJldHVybiB0Owp9CgovKiBVc2VkIHRvIGNvbXBhcmUgY2FzZSBsYWJlbHMu ICBLMSBhbmQgSzIgYXJlIGFjdHVhbGx5IHRyZWUgbm9kZXMKICAgcmVwcmVz ZW50aW5nIGNhc2UgbGFiZWxzLCBvciBOVUxMX1RSRUUgZm9yIGEgYGRlZmF1 bHQnIGxhYmVsLgogICBSZXR1cm5zIC0xIGlmIEsxIGlzIG9yZGVyZWQgYmVm b3JlIEsyLCAtMSBpZiBLMSBpcyBvcmRlcmVkIGFmdGVyCiAgIEsyLCBhbmQg MCBpZiBLMSBhbmQgSzIgYXJlIGVxdWFsLiAgKi8KCmludApjYXNlX2NvbXBh cmUgKHNwbGF5X3RyZWVfa2V5IGsxLCBzcGxheV90cmVlX2tleSBrMikKewog IC8qIENvbnNpZGVyIGEgTlVMTCBrZXkgKHN1Y2ggYXMgYXJpc2VzIHdpdGgg YSBgZGVmYXVsdCcgbGFiZWwpIHRvIGJlCiAgICAgc21hbGxlciB0aGFuIGFu eXRoaW5nIGVsc2UuICAqLwogIGlmICghazEpCiAgICByZXR1cm4gazIgPyAt MSA6IDA7CiAgZWxzZSBpZiAoIWsyKQogICAgcmV0dXJuIGsxID8gMSA6IDA7 CgogIHJldHVybiB0cmVlX2ludF9jc3RfY29tcGFyZSAoKHRyZWUpIGsxLCAo dHJlZSkgazIpOwp9CgovKiBQcm9jZXNzIGEgY2FzZSBsYWJlbCBmb3IgdGhl IHJhbmdlIExPV19WQUxVRSAuLi4gSElHSF9WQUxVRS4gIElmCiAgIExPV19W QUxVRSBhbmQgSElHSF9WQUxVRSBhcmUgYm90aCBOVUxMX1RSRUUgdGhlbiB0 aGlzIGNhc2UgbGFiZWwgaXMKICAgYWN0dWFsbHkgYSBgZGVmYXVsdCcgbGFi ZWwuICBJZiBvbmx5IEhJR0hfVkFMVUUgaXMgTlVMTF9UUkVFLCB0aGVuCiAg IGNhc2UgbGFiZWwgd2FzIGRlY2xhcmVkIHVzaW5nIHRoZSB1c3VhbCBDL0Mr KyBzeW50YXgsIHJhdGhlciB0aGFuCiAgIHRoZSBHTlUgY2FzZSByYW5nZSBl eHRlbnNpb24uICBDQVNFUyBpcyBhIHRyZWUgY29udGFpbmluZyBhbGwgdGhl CiAgIGNhc2UgcmFuZ2VzIHByb2Nlc3NlZCBzbyBmYXI7IENPTkQgaXMgdGhl IGNvbmRpdGlvbiBmb3IgdGhlCiAgIHN3aXRjaC1zdGF0ZW1lbnQgaXRzZWxm LiAgUmV0dXJucyB0aGUgQ0FTRV9MQUJFTF9FWFBSIGNyZWF0ZWQsIG9yCiAg IEVSUk9SX01BUktfTk9ERSBpZiBubyBDQVNFX0xBQkVMX0VYUFIgaXMgY3Jl YXRlZC4gICovCgp0cmVlCmNfYWRkX2Nhc2VfbGFiZWwgKHNwbGF5X3RyZWUg Y2FzZXMsIHRyZWUgY29uZCwgdHJlZSBvcmlnX3R5cGUsCgkJICB0cmVlIGxv d192YWx1ZSwgdHJlZSBoaWdoX3ZhbHVlKQp7CiAgdHJlZSB0eXBlOwogIHRy ZWUgbGFiZWw7CiAgdHJlZSBjYXNlX2xhYmVsOwogIHNwbGF5X3RyZWVfbm9k ZSBub2RlOwoKICAvKiBDcmVhdGUgdGhlIExBQkVMX0RFQ0wgaXRzZWxmLiAg Ki8KICBsYWJlbCA9IGNyZWF0ZV9hcnRpZmljaWFsX2xhYmVsICgpOwoKICAv KiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgc3dpdGNo IGNvbmRpdGlvbiwgYmFpbCBub3cKICAgICBiZWZvcmUgd2UgZ2V0IG1vcmUg Y29uZnVzZWQuICAqLwogIGlmICghY29uZCB8fCBjb25kID09IGVycm9yX21h cmtfbm9kZSkKICAgIGdvdG8gZXJyb3Jfb3V0OwoKICBpZiAoKGxvd192YWx1 ZSAmJiBUUkVFX1RZUEUgKGxvd192YWx1ZSkKICAgICAgICYmIFBPSU5URVJf VFlQRV9QIChUUkVFX1RZUEUgKGxvd192YWx1ZSkpKQogICAgICB8fCAoaGln aF92YWx1ZSAmJiBUUkVFX1RZUEUgKGhpZ2hfdmFsdWUpCgkgICYmIFBPSU5U RVJfVFlQRV9QIChUUkVFX1RZUEUgKGhpZ2hfdmFsdWUpKSkpCiAgICB7CiAg ICAgIGVycm9yICgicG9pbnRlcnMgYXJlIG5vdCBwZXJtaXR0ZWQgYXMgY2Fz ZSB2YWx1ZXMiKTsKICAgICAgZ290byBlcnJvcl9vdXQ7CiAgICB9CgogIC8q IENhc2UgcmFuZ2VzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwogIGlmICho aWdoX3ZhbHVlICYmIHBlZGFudGljKQogICAgcGVkd2FybiAoInJhbmdlIGV4 cHJlc3Npb25zIGluIHN3aXRjaCBzdGF0ZW1lbnRzIGFyZSBub24tc3RhbmRh cmQiKTsKCiAgdHlwZSA9IFRSRUVfVFlQRSAoY29uZCk7CiAgaWYgKGxvd192 YWx1ZSkKICAgIHsKICAgICAgbG93X3ZhbHVlID0gY2hlY2tfY2FzZV92YWx1 ZSAobG93X3ZhbHVlKTsKICAgICAgbG93X3ZhbHVlID0gY29udmVydF9hbmRf Y2hlY2sgKHR5cGUsIGxvd192YWx1ZSk7CiAgICAgIGlmIChsb3dfdmFsdWUg PT0gZXJyb3JfbWFya19ub2RlKQoJZ290byBlcnJvcl9vdXQ7CiAgICB9CiAg aWYgKGhpZ2hfdmFsdWUpCiAgICB7CiAgICAgIGhpZ2hfdmFsdWUgPSBjaGVj a19jYXNlX3ZhbHVlIChoaWdoX3ZhbHVlKTsKICAgICAgaGlnaF92YWx1ZSA9 IGNvbnZlcnRfYW5kX2NoZWNrICh0eXBlLCBoaWdoX3ZhbHVlKTsKICAgICAg aWYgKGhpZ2hfdmFsdWUgPT0gZXJyb3JfbWFya19ub2RlKQoJZ290byBlcnJv cl9vdXQ7CiAgICB9CgogIGlmIChsb3dfdmFsdWUgJiYgaGlnaF92YWx1ZSkK ICAgIHsKICAgICAgLyogSWYgdGhlIExPV19WQUxVRSBhbmQgSElHSF9WQUxV RSBhcmUgdGhlIHNhbWUsIHRoZW4gdGhpcyBpc24ndAoJIHJlYWxseSBhIGNh c2UgcmFuZ2UsIGV2ZW4gdGhvdWdoIGl0IHdhcyB3cml0dGVuIHRoYXQgd2F5 LgoJIFJlbW92ZSB0aGUgSElHSF9WQUxVRSB0byBzaW1wbGlmeSBsYXRlciBw cm9jZXNzaW5nLiAgKi8KICAgICAgaWYgKHRyZWVfaW50X2NzdF9lcXVhbCAo bG93X3ZhbHVlLCBoaWdoX3ZhbHVlKSkKCWhpZ2hfdmFsdWUgPSBOVUxMX1RS RUU7CiAgICAgIGVsc2UgaWYgKCF0cmVlX2ludF9jc3RfbHQgKGxvd192YWx1 ZSwgaGlnaF92YWx1ZSkpCgl3YXJuaW5nICgwLCAiZW1wdHkgcmFuZ2Ugc3Bl Y2lmaWVkIik7CiAgICB9CgogIC8qIFNlZSBpZiB0aGUgY2FzZSBpcyBpbiBy YW5nZSBvZiB0aGUgdHlwZSBvZiB0aGUgb3JpZ2luYWwgdGVzdGluZwogICAg IGV4cHJlc3Npb24uICBJZiBib3RoIGxvd192YWx1ZSBhbmQgaGlnaF92YWx1 ZSBhcmUgb3V0IG9mIHJhbmdlLAogICAgIGRvbid0IGluc2VydCB0aGUgY2Fz ZSBsYWJlbCBhbmQgcmV0dXJuIE5VTExfVFJFRS4gICovCiAgaWYgKGxvd192 YWx1ZQogICAgICAmJiAhY2hlY2tfY2FzZV9ib3VuZHMgKHR5cGUsIG9yaWdf dHlwZSwKCQkJICAgICAmbG93X3ZhbHVlLCBoaWdoX3ZhbHVlID8gJmhpZ2hf dmFsdWUgOiBOVUxMKSkKICAgIHJldHVybiBOVUxMX1RSRUU7CgogIC8qIExv b2sgdXAgdGhlIExPV19WQUxVRSBpbiB0aGUgdGFibGUgb2YgY2FzZSBsYWJl bHMgd2UgYWxyZWFkeQogICAgIGhhdmUuICAqLwogIG5vZGUgPSBzcGxheV90 cmVlX2xvb2t1cCAoY2FzZXMsIChzcGxheV90cmVlX2tleSkgbG93X3ZhbHVl KTsKICAvKiBJZiB0aGVyZSB3YXMgbm90IGFuIGV4YWN0IG1hdGNoLCBjaGVj ayBmb3Igb3ZlcmxhcHBpbmcgcmFuZ2VzLgogICAgIFRoZXJlJ3Mgbm8gbmVl ZCB0byBkbyB0aGlzIGlmIHRoZXJlJ3Mgbm8gTE9XX1ZBTFVFIG9yIEhJR0hf VkFMVUU7CiAgICAgdGhhdCdzIGEgYGRlZmF1bHQnIGxhYmVsIGFuZCB0aGUg b25seSBvdmVybGFwIGlzIGFuIGV4YWN0IG1hdGNoLiAgKi8KICBpZiAoIW5v ZGUgJiYgKGxvd192YWx1ZSB8fCBoaWdoX3ZhbHVlKSkKICAgIHsKICAgICAg c3BsYXlfdHJlZV9ub2RlIGxvd19ib3VuZDsKICAgICAgc3BsYXlfdHJlZV9u b2RlIGhpZ2hfYm91bmQ7CgogICAgICAvKiBFdmVuIHRob3VnaCB0aGVyZSB3 YXNuJ3QgYW4gZXhhY3QgbWF0Y2gsIHRoZXJlIG1pZ2h0IGJlIGFuCgkgb3Zl cmxhcCBiZXR3ZWVuIHRoaXMgY2FzZSByYW5nZSBhbmQgYW5vdGhlciBjYXNl IHJhbmdlLgoJIFNpbmNlIHdlJ3ZlIChpbmR1Y3RpdmVseSkgbm90IGFsbG93 ZWQgYW55IG92ZXJsYXBwaW5nIGNhc2UKCSByYW5nZXMsIHdlIHNpbXBseSBu ZWVkIHRvIGZpbmQgdGhlIGdyZWF0ZXN0IGxvdyBjYXNlIGxhYmVsCgkgdGhh dCBpcyBzbWFsbGVyIHRoYXQgTE9XX1ZBTFVFLCBhbmQgdGhlIHNtYWxsZXN0 IGxvdyBjYXNlCgkgbGFiZWwgdGhhdCBpcyBncmVhdGVyIHRoYW4gTE9XX1ZB TFVFLiAgSWYgdGhlcmUgaXMgYW4gb3ZlcmxhcAoJIGl0IHdpbGwgb2NjdXIg aW4gb25lIG9mIHRoZXNlIHR3byByYW5nZXMuICAqLwogICAgICBsb3dfYm91 bmQgPSBzcGxheV90cmVlX3ByZWRlY2Vzc29yIChjYXNlcywKCQkJCQkgIChz cGxheV90cmVlX2tleSkgbG93X3ZhbHVlKTsKICAgICAgaGlnaF9ib3VuZCA9 IHNwbGF5X3RyZWVfc3VjY2Vzc29yIChjYXNlcywKCQkJCQkgKHNwbGF5X3Ry ZWVfa2V5KSBsb3dfdmFsdWUpOwoKICAgICAgLyogQ2hlY2sgdG8gc2VlIGlm IHRoZSBMT1dfQk9VTkQgb3ZlcmxhcHMuICBJdCBpcyBzbWFsbGVyIHRoYW4K CSB0aGUgTE9XX1ZBTFVFLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNr IHVubGVzcyB0aGUKCSBMT1dfQk9VTkQgaXMgaW4gZmFjdCBpdHNlbGYgYSBj YXNlIHJhbmdlLiAgKi8KICAgICAgaWYgKGxvd19ib3VuZAoJICAmJiBDQVNF X0hJR0ggKCh0cmVlKSBsb3dfYm91bmQtPnZhbHVlKQoJICAmJiB0cmVlX2lu dF9jc3RfY29tcGFyZSAoQ0FTRV9ISUdIICgodHJlZSkgbG93X2JvdW5kLT52 YWx1ZSksCgkJCQkgICAgbG93X3ZhbHVlKSA+PSAwKQoJbm9kZSA9IGxvd19i b3VuZDsKICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBISUdIX0JPVU5E IG92ZXJsYXBzLiAgVGhlIGxvdyBlbmQgb2YgdGhhdAoJIHJhbmdlIGlzIGJp Z2dlciB0aGFuIHRoZSBsb3cgZW5kIG9mIHRoZSBjdXJyZW50IHJhbmdlLCBz byB3ZQoJIGFyZSBvbmx5IGludGVyZXN0ZWQgaWYgdGhlIGN1cnJlbnQgcmFu Z2UgaXMgYSByZWFsIHJhbmdlLCBhbmQKCSBub3QgYW4gb3JkaW5hcnkgY2Fz ZSBsYWJlbC4gICovCiAgICAgIGVsc2UgaWYgKGhpZ2hfYm91bmQKCSAgICAg ICAmJiBoaWdoX3ZhbHVlCgkgICAgICAgJiYgKHRyZWVfaW50X2NzdF9jb21w YXJlICgodHJlZSkgaGlnaF9ib3VuZC0+a2V5LAoJCQkJCSBoaWdoX3ZhbHVl KQoJCSAgIDw9IDApKQoJbm9kZSA9IGhpZ2hfYm91bmQ7CiAgICB9CiAgLyog SWYgdGhlcmUgd2FzIGFuIG92ZXJsYXAsIGlzc3VlIGFuIGVycm9yLiAgKi8K ICBpZiAobm9kZSkKICAgIHsKICAgICAgdHJlZSBkdXBsaWNhdGUgPSBDQVNF X0xBQkVMICgodHJlZSkgbm9kZS0+dmFsdWUpOwoKICAgICAgaWYgKGhpZ2hf dmFsdWUpCgl7CgkgIGVycm9yICgiZHVwbGljYXRlIChvciBvdmVybGFwcGlu ZykgY2FzZSB2YWx1ZSIpOwoJICBlcnJvciAoIiVKdGhpcyBpcyB0aGUgZmly c3QgZW50cnkgb3ZlcmxhcHBpbmcgdGhhdCB2YWx1ZSIsIGR1cGxpY2F0ZSk7 Cgl9CiAgICAgIGVsc2UgaWYgKGxvd192YWx1ZSkKCXsKCSAgZXJyb3IgKCJk dXBsaWNhdGUgY2FzZSB2YWx1ZSIpIDsKCSAgZXJyb3IgKCIlSnByZXZpb3Vz bHkgdXNlZCBoZXJlIiwgZHVwbGljYXRlKTsKCX0KICAgICAgZWxzZQoJewoJ ICBlcnJvciAoIm11bHRpcGxlIGRlZmF1bHQgbGFiZWxzIGluIG9uZSBzd2l0 Y2giKTsKCSAgZXJyb3IgKCIlSnRoaXMgaXMgdGhlIGZpcnN0IGRlZmF1bHQg bGFiZWwiLCBkdXBsaWNhdGUpOwoJfQogICAgICBnb3RvIGVycm9yX291dDsK ICAgIH0KCiAgLyogQWRkIGEgQ0FTRV9MQUJFTCB0byB0aGUgc3RhdGVtZW50 LXRyZWUuICAqLwogIGNhc2VfbGFiZWwgPSBhZGRfc3RtdCAoYnVpbGRfY2Fz ZV9sYWJlbCAobG93X3ZhbHVlLCBoaWdoX3ZhbHVlLCBsYWJlbCkpOwogIC8q IFJlZ2lzdGVyIHRoaXMgY2FzZSBsYWJlbCBpbiB0aGUgc3BsYXkgdHJlZS4g ICovCiAgc3BsYXlfdHJlZV9pbnNlcnQgKGNhc2VzLAoJCSAgICAgKHNwbGF5 X3RyZWVfa2V5KSBsb3dfdmFsdWUsCgkJICAgICAoc3BsYXlfdHJlZV92YWx1 ZSkgY2FzZV9sYWJlbCk7CgogIHJldHVybiBjYXNlX2xhYmVsOwoKIGVycm9y X291dDoKICAvKiBBZGQgYSBsYWJlbCBzbyB0aGF0IHRoZSBiYWNrLWVuZCBk b2Vzbid0IHRoaW5rIHRoYXQgdGhlIGJlZ2lubmluZyBvZgogICAgIHRoZSBz d2l0Y2ggaXMgdW5yZWFjaGFibGUuICBOb3RlIHRoYXQgd2UgZG8gbm90IGFk ZCBhIGNhc2UgbGFiZWwsIGFzCiAgICAgdGhhdCBqdXN0IGxlYWRzIHRvIGR1 cGxpY2F0ZXMgYW5kIHRoZW5jZSB0byBmYWlsdXJlIGxhdGVyIG9uLiAgKi8K ICBpZiAoIWNhc2VzLT5yb290KQogICAgewogICAgICB0cmVlIHQgPSBjcmVh dGVfYXJ0aWZpY2lhbF9sYWJlbCAoKTsKICAgICAgYWRkX3N0bXQgKGJ1aWxk X3N0bXQgKExBQkVMX0VYUFIsIHQpKTsKICAgIH0KICByZXR1cm4gZXJyb3Jf bWFya19ub2RlOwp9CgovKiBTdWJyb3V0aW5lcyBvZiBjX2RvX3N3aXRjaF93 YXJuaW5ncywgY2FsbGVkIHZpYSBzcGxheV90cmVlX2ZvcmVhY2guCiAgIFVz ZWQgdG8gdmVyaWZ5IHRoYXQgY2FzZSB2YWx1ZXMgbWF0Y2ggdXAgd2l0aCBl bnVtZXJhdG9yIHZhbHVlcy4gICovCgpzdGF0aWMgdm9pZAptYXRjaF9jYXNl X3RvX2VudW1fMSAodHJlZSBrZXksIHRyZWUgdHlwZSwgdHJlZSBsYWJlbCkK ewogIGNoYXIgYnVmWzIgKyAyKkhPU1RfQklUU19QRVJfV0lERV9JTlQvNCAr IDFdOwoKICAvKiA/Pz8gTm90IHdvcmtpbmcgdG9vIGhhcmQgdG8gcHJpbnQg dGhlIGRvdWJsZS13b3JkIHZhbHVlLgogICAgIFNob3VsZCBwZXJoYXBzIGJl IGRvbmUgd2l0aCAlbHdkIGluIHRoZSBkaWFnbm9zdGljIHJvdXRpbmVzPyAg Ki8KICBpZiAoVFJFRV9JTlRfQ1NUX0hJR0ggKGtleSkgPT0gMCkKICAgIHNu cHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgSE9TVF9XSURFX0lOVF9QUklO VF9VTlNJR05FRCwKCSAgICAgIFRSRUVfSU5UX0NTVF9MT1cgKGtleSkpOwog IGVsc2UgaWYgKCFUWVBFX1VOU0lHTkVEICh0eXBlKQoJICAgJiYgVFJFRV9J TlRfQ1NUX0hJR0ggKGtleSkgPT0gLTEKCSAgICYmIFRSRUVfSU5UX0NTVF9M T1cgKGtleSkgIT0gMCkKICAgIHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVm KSwgIi0iIEhPU1RfV0lERV9JTlRfUFJJTlRfVU5TSUdORUQsCgkgICAgICAt VFJFRV9JTlRfQ1NUX0xPVyAoa2V5KSk7CiAgZWxzZQogICAgc25wcmludGYg KGJ1Ziwgc2l6ZW9mIChidWYpLCBIT1NUX1dJREVfSU5UX1BSSU5UX0RPVUJM RV9IRVgsCgkgICAgICBUUkVFX0lOVF9DU1RfSElHSCAoa2V5KSwgVFJFRV9J TlRfQ1NUX0xPVyAoa2V5KSk7CgogIGlmIChUWVBFX05BTUUgKHR5cGUpID09 IDApCiAgICB3YXJuaW5nICgwLCAiJUpjYXNlIHZhbHVlICVxcyBub3QgaW4g ZW51bWVyYXRlZCB0eXBlIiwKCSAgICAgQ0FTRV9MQUJFTCAobGFiZWwpLCBi dWYpOwogIGVsc2UKICAgIHdhcm5pbmcgKDAsICIlSmNhc2UgdmFsdWUgJXFz IG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJXFUIiwKCSAgICAgQ0FTRV9MQUJF TCAobGFiZWwpLCBidWYsIHR5cGUpOwp9CgovKiBTdWJyb3V0aW5lIG9mIGNf ZG9fc3dpdGNoX3dhcm5pbmdzLCBjYWxsZWQgdmlhIHNwbGF5X3RyZWVfZm9y ZWFjaC4KICAgVXNlZCB0byB2ZXJpZnkgdGhhdCBjYXNlIHZhbHVlcyBtYXRj aCB1cCB3aXRoIGVudW1lcmF0b3IgdmFsdWVzLiAgKi8KCnN0YXRpYyBpbnQK bWF0Y2hfY2FzZV90b19lbnVtIChzcGxheV90cmVlX25vZGUgbm9kZSwgdm9p ZCAqZGF0YSkKewogIHRyZWUgbGFiZWwgPSAodHJlZSkgbm9kZS0+dmFsdWU7 CiAgdHJlZSB0eXBlID0gKHRyZWUpIGRhdGE7CgogIC8qIFNraXAgZGVmYXVs dCBjYXNlLiAgKi8KICBpZiAoIUNBU0VfTE9XIChsYWJlbCkpCiAgICByZXR1 cm4gMDsKCiAgLyogSWYgQ0FTRV9MT1dfU0VFTiBpcyBub3Qgc2V0LCB0aGF0 IG1lYW5zIENBU0VfTE9XIGRpZCBub3QgYXBwZWFyCiAgICAgd2hlbiB3ZSBk aWQgb3VyIGVudW0tPmNhc2Ugc2Nhbi4gIFJlc2V0IG91ciBzY3JhdGNoIGJp dCBhZnRlci4gICovCiAgaWYgKCFDQVNFX0xPV19TRUVOIChsYWJlbCkpCiAg ICBtYXRjaF9jYXNlX3RvX2VudW1fMSAoQ0FTRV9MT1cgKGxhYmVsKSwgdHlw ZSwgbGFiZWwpOwogIGVsc2UKICAgIENBU0VfTE9XX1NFRU4gKGxhYmVsKSA9 IDA7CgogIC8qIElmIENBU0VfSElHSCBpcyBub24tbnVsbCwgd2UgaGF2ZSBh IHJhbmdlLiAgSWYgQ0FTRV9ISUdIX1NFRU4gaXMKICAgICBub3Qgc2V0LCB0 aGF0IG1lYW5zIHRoYXQgQ0FTRV9ISUdIIGRpZCBub3QgYXBwZWFyIHdoZW4g d2UgZGlkIG91cgogICAgIGVudW0tPmNhc2Ugc2Nhbi4gIFJlc2V0IG91ciBz Y3JhdGNoIGJpdCBhZnRlci4gICovCiAgaWYgKENBU0VfSElHSCAobGFiZWwp KQogICAgewogICAgICBpZiAoIUNBU0VfSElHSF9TRUVOIChsYWJlbCkpCglt YXRjaF9jYXNlX3RvX2VudW1fMSAoQ0FTRV9ISUdIIChsYWJlbCksIHR5cGUs IGxhYmVsKTsKICAgICAgZWxzZQoJQ0FTRV9ISUdIX1NFRU4gKGxhYmVsKSA9 IDA7CiAgICB9CgogIHJldHVybiAwOwp9CgovKiBIYW5kbGUgLVdzd2l0Y2gq LiAgQ2FsbGVkIGZyb20gdGhlIGZyb250IGVuZCBhZnRlciBwYXJzaW5nIHRo ZQogICBzd2l0Y2ggY29uc3RydWN0LiAgKi8KLyogPz8/IFNob3VsZCBwcm9i YWJseSBiZSBzb21ld2hlcmUgZ2VuZXJpYywgc2luY2Ugb3RoZXIgbGFuZ3Vh Z2VzCiAgIGJlc2lkZXMgQyBhbmQgQysrIHdvdWxkIHdhbnQgdGhpcy4gIEF0 IHRoZSBtb21lbnQsIGhvd2V2ZXIsIEMvQysrCiAgIGFyZSB0aGUgb25seSB0 cmVlLXNzYSBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IGVudW1lcmF0aW9ucyBh dCBhbGwsCiAgIHNvIHRoZSBwb2ludCBpcyBtb290LiAgKi8KCnZvaWQKY19k b19zd2l0Y2hfd2FybmluZ3MgKHNwbGF5X3RyZWUgY2FzZXMsIGxvY2F0aW9u X3Qgc3dpdGNoX2xvY2F0aW9uLAoJCSAgICAgIHRyZWUgdHlwZSwgdHJlZSBj b25kKQp7CiAgc3BsYXlfdHJlZV9ub2RlIGRlZmF1bHRfbm9kZTsKICBzcGxh eV90cmVlX25vZGUgbm9kZTsKICB0cmVlIGNoYWluOwoKICBpZiAoIXdhcm5f c3dpdGNoICYmICF3YXJuX3N3aXRjaF9lbnVtICYmICF3YXJuX3N3aXRjaF9k ZWZhdWx0KQogICAgcmV0dXJuOwoKICBkZWZhdWx0X25vZGUgPSBzcGxheV90 cmVlX2xvb2t1cCAoY2FzZXMsIChzcGxheV90cmVlX2tleSkgTlVMTCk7CiAg aWYgKCFkZWZhdWx0X25vZGUpCiAgICB3YXJuaW5nIChPUFRfV3N3aXRjaF9k ZWZhdWx0LCAiJUhzd2l0Y2ggbWlzc2luZyBkZWZhdWx0IGNhc2UiLAoJICAg ICAmc3dpdGNoX2xvY2F0aW9uKTsKCiAgLyogRnJvbSBoZXJlIG9uLCB3ZSBv bmx5IGNhcmUgYWJvdXQgYWJvdXQgZW51bWVyYXRlZCB0eXBlcy4gICovCiAg aWYgKCF0eXBlIHx8IFRSRUVfQ09ERSAodHlwZSkgIT0gRU5VTUVSQUxfVFlQ RSkKICAgIHJldHVybjsKCiAgLyogSWYgdGhlIHN3aXRjaCBleHByZXNzaW9u IHdhcyBhbiBlbnVtZXJhdGVkIHR5cGUsIGNoZWNrIHRoYXQKICAgICBleGFj dGx5IGFsbCBlbnVtZXJhdGlvbiBsaXRlcmFscyBhcmUgY292ZXJlZCBieSB0 aGUgY2FzZXMuCiAgICAgVGhlIGNoZWNrIGlzIG1hZGUgd2hlbiAtV3N3aXRj aCB3YXMgc3BlY2lmaWVkIGFuZCB0aGVyZSBpcyBubwogICAgIGRlZmF1bHQg Y2FzZSwgb3Igd2hlbiAtV3N3aXRjaC1lbnVtIHdhcyBzcGVjaWZpZWQuICAq LwoKICBpZiAoIXdhcm5fc3dpdGNoX2VudW0KICAgICAgJiYgISh3YXJuX3N3 aXRjaCAmJiAhZGVmYXVsdF9ub2RlKSkKICAgIHJldHVybjsKCiAgLyogQ2xl YXJpbmcgQ09ORCBpZiBpdCBpcyBub3QgYW4gaW50ZWdlciBjb25zdGFudCBz aW1wbGlmaWVzCiAgICAgdGhlIHRlc3RzIGluc2lkZSB0aGUgbG9vcCBiZWxv dy4gICovCiAgaWYgKFRSRUVfQ09ERSAoY29uZCkgIT0gSU5URUdFUl9DU1Qp CiAgICBjb25kID0gTlVMTF9UUkVFOwoKICAvKiBUaGUgdGltZSBjb21wbGV4 aXR5IGhlcmUgaXMgTyhOKmxnKE4pKSB3b3JzdCBjYXNlLCBidXQgZm9yIHRo ZQogICAgICBjb21tb24gY2FzZSBvZiBtb25vdG9uaWNhbGx5IGluY3JlYXNp bmcgZW51bWVyYXRvcnMsIGl0IGlzCiAgICAgIE8oTiksIHNpbmNlIHRoZSBu YXR1cmUgb2YgdGhlIHNwbGF5IHRyZWUgd2lsbCBrZWVwIHRoZSBuZXh0CiAg ICAgIGVsZW1lbnQgYWRqYWNlbnQgdG8gdGhlIHJvb3QgYXQgYWxsIHRpbWVz LiAgKi8KCiAgZm9yIChjaGFpbiA9IFRZUEVfVkFMVUVTICh0eXBlKTsgY2hh aW47IGNoYWluID0gVFJFRV9DSEFJTiAoY2hhaW4pKQogICAgewogICAgICB0 cmVlIHZhbHVlID0gVFJFRV9WQUxVRSAoY2hhaW4pOwogICAgICBub2RlID0g c3BsYXlfdHJlZV9sb29rdXAgKGNhc2VzLCAoc3BsYXlfdHJlZV9rZXkpIHZh bHVlKTsKICAgICAgaWYgKG5vZGUpCgl7CgkgIC8qIE1hcmsgdGhlIENBU0Vf TE9XIHBhcnQgb2YgdGhlIGNhc2UgZW50cnkgYXMgc2Vlbi4gICovCgkgIHRy ZWUgbGFiZWwgPSAodHJlZSkgbm9kZS0+dmFsdWU7CgkgIENBU0VfTE9XX1NF RU4gKGxhYmVsKSA9IDE7CgkgIGNvbnRpbnVlOwoJfQoKICAgICAgLyogRXZl biB0aG91Z2ggdGhlcmUgd2Fzbid0IGFuIGV4YWN0IG1hdGNoLCB0aGVyZSBt aWdodCBiZSBhCgkgY2FzZSByYW5nZSB3aGljaCBpbmNsdWRlcyB0aGUgZW51 bWF0b3IncyB2YWx1ZS4gICovCiAgICAgIG5vZGUgPSBzcGxheV90cmVlX3By ZWRlY2Vzc29yIChjYXNlcywgKHNwbGF5X3RyZWVfa2V5KSB2YWx1ZSk7CiAg ICAgIGlmIChub2RlICYmIENBU0VfSElHSCAoKHRyZWUpIG5vZGUtPnZhbHVl KSkKCXsKCSAgdHJlZSBsYWJlbCA9ICh0cmVlKSBub2RlLT52YWx1ZTsKCSAg aW50IGNtcCA9IHRyZWVfaW50X2NzdF9jb21wYXJlIChDQVNFX0hJR0ggKGxh YmVsKSwgdmFsdWUpOwoJICBpZiAoY21wID49IDApCgkgICAgewoJICAgICAg LyogSWYgd2UgbWF0Y2ggdGhlIHVwcGVyIGJvdW5kIGV4YWN0bHksIG1hcmsg dGhlIENBU0VfSElHSAoJCSBwYXJ0IG9mIHRoZSBjYXNlIGVudHJ5IGFzIHNl ZW4uICAqLwoJICAgICAgaWYgKGNtcCA9PSAwKQoJCUNBU0VfSElHSF9TRUVO IChsYWJlbCkgPSAxOwoJICAgICAgY29udGludWU7CgkgICAgfQoJfQoKICAg ICAgLyogV2UndmUgbm93IGRldGVybWluZWQgdGhhdCB0aGlzIGVudW1lcmF0 ZWQgbGl0ZXJhbCBpc24ndAoJIGhhbmRsZWQgYnkgdGhlIGNhc2UgbGFiZWxz IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50LiAgKi8KCiAgICAgIC8qIElmIHRo ZSBzd2l0Y2ggZXhwcmVzc2lvbiBpcyBhIGNvbnN0YW50LCB3ZSBvbmx5IHJl YWxseSBjYXJlCgkgYWJvdXQgd2hldGhlciB0aGF0IGNvbnN0YW50IGlzIGhh bmRsZWQgYnkgdGhlIHN3aXRjaC4gICovCiAgICAgIGlmIChjb25kICYmIHRy ZWVfaW50X2NzdF9jb21wYXJlIChjb25kLCB2YWx1ZSkpCgljb250aW51ZTsK CiAgICAgIHdhcm5pbmcgKDAsICIlSGVudW1lcmF0aW9uIHZhbHVlICVxRSBu b3QgaGFuZGxlZCBpbiBzd2l0Y2giLAoJICAgICAgICZzd2l0Y2hfbG9jYXRp b24sIFRSRUVfUFVSUE9TRSAoY2hhaW4pKTsKICAgIH0KCiAgLyogV2FybiBp ZiB0aGVyZSBhcmUgY2FzZSBleHByZXNzaW9ucyB0aGF0IGRvbid0IGNvcnJl c3BvbmQgdG8KICAgICBlbnVtZXJhdG9ycy4gIFRoaXMgY2FuIG9jY3VyIHNp bmNlIEMgYW5kIEMrKyBkb24ndCBlbmZvcmNlCiAgICAgdHlwZS1jaGVja2lu ZyBvZiBhc3NpZ25tZW50cyB0byBlbnVtZXJhdGlvbiB2YXJpYWJsZXMuCgog ICAgIFRoZSB0aW1lIGNvbXBsZXhpdHkgaGVyZSBpcyBub3cgYWx3YXlzIE8o Tikgd29yc3QgY2FzZSwgc2luY2UKICAgICB3ZSBzaG91bGQgaGF2ZSBtYXJr ZWQgYm90aCB0aGUgbG93ZXIgYm91bmQgYW5kIHVwcGVyIGJvdW5kIG9mCiAg ICAgZXZlcnkgZGlzam9pbnQgY2FzZSBsYWJlbCwgd2l0aCBDQVNFX0xPV19T RUVOIGFuZCBDQVNFX0hJR0hfU0VFTgogICAgIGFib3ZlLiAgVGhpcyBzY2Fu IGFsc28gcmVzZXRzIHRob3NlIGZpZWxkcy4gICovCiAgc3BsYXlfdHJlZV9m b3JlYWNoIChjYXNlcywgbWF0Y2hfY2FzZV90b19lbnVtLCB0eXBlKTsKfQoK LyogRmluaXNoIGFuIGV4cHJlc3Npb24gdGFraW5nIHRoZSBhZGRyZXNzIG9m IExBQkVMIChhbgogICBJREVOVElGSUVSX05PREUpLiAgUmV0dXJucyBhbiBl eHByZXNzaW9uIGZvciB0aGUgYWRkcmVzcy4gICovCgp0cmVlCmZpbmlzaF9s YWJlbF9hZGRyZXNzX2V4cHIgKHRyZWUgbGFiZWwpCnsKICB0cmVlIHJlc3Vs dDsKCiAgaWYgKHBlZGFudGljKQogICAgcGVkd2FybiAoInRha2luZyB0aGUg YWRkcmVzcyBvZiBhIGxhYmVsIGlzIG5vbi1zdGFuZGFyZCIpOwoKICBpZiAo bGFiZWwgPT0gZXJyb3JfbWFya19ub2RlKQogICAgcmV0dXJuIGVycm9yX21h cmtfbm9kZTsKCiAgbGFiZWwgPSBsb29rdXBfbGFiZWwgKGxhYmVsKTsKICBp ZiAobGFiZWwgPT0gTlVMTF9UUkVFKQogICAgcmVzdWx0ID0gbnVsbF9wb2lu dGVyX25vZGU7CiAgZWxzZQogICAgewogICAgICBUUkVFX1VTRUQgKGxhYmVs KSA9IDE7CiAgICAgIHJlc3VsdCA9IGJ1aWxkMSAoQUREUl9FWFBSLCBwdHJf dHlwZV9ub2RlLCBsYWJlbCk7CiAgICAgIC8qIFRoZSBjdXJyZW50IGZ1bmN0 aW9uIGluIG5vdCBuZWNlc3NhcmlseSB1bmlubGluYWJsZS4KCSBDb21wdXRl ZCBnb3RvcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggaW5saW5pbmcsIGJ1dCB0 aGUgdmFsdWUKCSBoZXJlIGNvdWxkIGJlIHVzZWQgb25seSBpbiBhIGRpYWdu b3N0aWMsIGZvciBleGFtcGxlLiAgKi8KICAgIH0KCiAgcmV0dXJuIHJlc3Vs dDsKfQoKLyogSG9vayB1c2VkIGJ5IGV4cGFuZF9leHByIHRvIGV4cGFuZCBs YW5ndWFnZS1zcGVjaWZpYyB0cmVlIGNvZGVzLiAgKi8KLyogVGhlIG9ubHkg dGhpbmdzIHRoYXQgc2hvdWxkIGdvIGhlcmUgYXJlIGJpdHMgbmVlZGVkIHRv IGV4cGFuZAogICBjb25zdGFudCBpbml0aWFsaXplcnMuICBFdmVyeXRoaW5n IGVsc2Ugc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlCiAgIGdpbXBsaWZpY2F0 aW9uIHJvdXRpbmVzLiAgKi8KCnJ0eApjX2V4cGFuZF9leHByICh0cmVlIGV4 cCwgcnR4IHRhcmdldCwgZW51bSBtYWNoaW5lX21vZGUgdG1vZGUsCgkgICAg ICAgaW50IG1vZGlmaWVyIC8qIEFjdHVhbGx5IGVudW1fbW9kaWZpZXIuICAq LywKCSAgICAgICBydHggKmFsdF9ydGwpCnsKICBzd2l0Y2ggKFRSRUVfQ09E RSAoZXhwKSkKICAgIHsKICAgIGNhc2UgQ09NUE9VTkRfTElURVJBTF9FWFBS OgogICAgICB7CgkvKiBJbml0aWFsaXplIHRoZSBhbm9ueW1vdXMgdmFyaWFi bGUgZGVjbGFyZWQgaW4gdGhlIGNvbXBvdW5kCgkgICBsaXRlcmFsLCB0aGVu IHJldHVybiB0aGUgdmFyaWFibGUuICAqLwoJdHJlZSBkZWNsID0gQ09NUE9V TkRfTElURVJBTF9FWFBSX0RFQ0wgKGV4cCk7CgllbWl0X2xvY2FsX3ZhciAo ZGVjbCk7CglyZXR1cm4gZXhwYW5kX2V4cHJfcmVhbCAoZGVjbCwgdGFyZ2V0 LCB0bW9kZSwgbW9kaWZpZXIsIGFsdF9ydGwpOwogICAgICB9CgogICAgZGVm YXVsdDoKICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgfQp9CgovKiBI b29rIHVzZWQgYnkgc3RhdGljcCB0byBoYW5kbGUgbGFuZ3VhZ2Utc3BlY2lm aWMgdHJlZSBjb2Rlcy4gICovCgp0cmVlCmNfc3RhdGljcCAodHJlZSBleHAp CnsKICByZXR1cm4gKFRSRUVfQ09ERSAoZXhwKSA9PSBDT01QT1VORF9MSVRF UkFMX0VYUFIKCSAgJiYgVFJFRV9TVEFUSUMgKENPTVBPVU5EX0xJVEVSQUxf RVhQUl9ERUNMIChleHApKQoJICA/IGV4cCA6IE5VTEwpOwp9CgwKCi8qIEdp dmVuIGEgYm9vbGVhbiBleHByZXNzaW9uIEFSRywgcmV0dXJuIGEgdHJlZSBy ZXByZXNlbnRpbmcgYW4gaW5jcmVtZW50CiAgIG9yIGRlY3JlbWVudCAoYXMg aW5kaWNhdGVkIGJ5IENPREUpIG9mIEFSRy4gIFRoZSBmcm9udCBlbmQgbXVz dCBjaGVjayBmb3IKICAgaW52YWxpZCBjYXNlcyAoZS5nLiwgZGVjcmVtZW50 IGluIEMrKykuICAqLwp0cmVlCmJvb2xlYW5faW5jcmVtZW50IChlbnVtIHRy ZWVfY29kZSBjb2RlLCB0cmVlIGFyZykKewogIHRyZWUgdmFsOwogIHRyZWUg dHJ1ZV9yZXMgPSBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKGFyZyksIDEp OwoKICBhcmcgPSBzdGFiaWxpemVfcmVmZXJlbmNlIChhcmcpOwogIHN3aXRj aCAoY29kZSkKICAgIHsKICAgIGNhc2UgUFJFSU5DUkVNRU5UX0VYUFI6CiAg ICAgIHZhbCA9IGJ1aWxkMiAoTU9ESUZZX0VYUFIsIFRSRUVfVFlQRSAoYXJn KSwgYXJnLCB0cnVlX3Jlcyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBQT1NU SU5DUkVNRU5UX0VYUFI6CiAgICAgIHZhbCA9IGJ1aWxkMiAoTU9ESUZZX0VY UFIsIFRSRUVfVFlQRSAoYXJnKSwgYXJnLCB0cnVlX3Jlcyk7CiAgICAgIGFy ZyA9IHNhdmVfZXhwciAoYXJnKTsKICAgICAgdmFsID0gYnVpbGQyIChDT01Q T1VORF9FWFBSLCBUUkVFX1RZUEUgKGFyZyksIHZhbCwgYXJnKTsKICAgICAg dmFsID0gYnVpbGQyIChDT01QT1VORF9FWFBSLCBUUkVFX1RZUEUgKGFyZyks IGFyZywgdmFsKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFBSRURFQ1JFTUVO VF9FWFBSOgogICAgICB2YWwgPSBidWlsZDIgKE1PRElGWV9FWFBSLCBUUkVF X1RZUEUgKGFyZyksIGFyZywKCQkgICAgaW52ZXJ0X3RydXRodmFsdWUgKGFy ZykpOwogICAgICBicmVhazsKICAgIGNhc2UgUE9TVERFQ1JFTUVOVF9FWFBS OgogICAgICB2YWwgPSBidWlsZDIgKE1PRElGWV9FWFBSLCBUUkVFX1RZUEUg KGFyZyksIGFyZywKCQkgICAgaW52ZXJ0X3RydXRodmFsdWUgKGFyZykpOwog ICAgICBhcmcgPSBzYXZlX2V4cHIgKGFyZyk7CiAgICAgIHZhbCA9IGJ1aWxk MiAoQ09NUE9VTkRfRVhQUiwgVFJFRV9UWVBFIChhcmcpLCB2YWwsIGFyZyk7 CiAgICAgIHZhbCA9IGJ1aWxkMiAoQ09NUE9VTkRfRVhQUiwgVFJFRV9UWVBF IChhcmcpLCBhcmcsIHZhbCk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoK ICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgfQogIFRSRUVfU0lERV9F RkZFQ1RTICh2YWwpID0gMTsKICByZXR1cm4gdmFsOwp9CgwKLyogQnVpbHQt aW4gbWFjcm9zIGZvciBzdGRkZWYuaCwgdGhhdCByZXF1aXJlIG1hY3JvcyBk ZWZpbmVkIGluIHRoaXMKICAgZmlsZS4gICovCnZvaWQKY19zdGRkZWZfY3Bw X2J1aWx0aW5zKHZvaWQpCnsKICBidWlsdGluX2RlZmluZV93aXRoX3ZhbHVl ICgiX19TSVpFX1RZUEVfXyIsIFNJWkVfVFlQRSwgMCk7CiAgYnVpbHRpbl9k ZWZpbmVfd2l0aF92YWx1ZSAoIl9fUFRSRElGRl9UWVBFX18iLCBQVFJESUZG X1RZUEUsIDApOwogIGJ1aWx0aW5fZGVmaW5lX3dpdGhfdmFsdWUgKCJfX1dD SEFSX1RZUEVfXyIsIE1PRElGSUVEX1dDSEFSX1RZUEUsIDApOwogIGJ1aWx0 aW5fZGVmaW5lX3dpdGhfdmFsdWUgKCJfX1dJTlRfVFlQRV9fIiwgV0lOVF9U WVBFLCAwKTsKICBidWlsdGluX2RlZmluZV93aXRoX3ZhbHVlICgiX19JTlRN QVhfVFlQRV9fIiwgSU5UTUFYX1RZUEUsIDApOwogIGJ1aWx0aW5fZGVmaW5l X3dpdGhfdmFsdWUgKCJfX1VJTlRNQVhfVFlQRV9fIiwgVUlOVE1BWF9UWVBF LCAwKTsKfQoKc3RhdGljIHZvaWQKY19pbml0X2F0dHJpYnV0ZXMgKHZvaWQp CnsKICAvKiBGaWxsIGluIHRoZSBidWlsdF9pbl9hdHRyaWJ1dGVzIGFycmF5 LiAgKi8KI2RlZmluZSBERUZfQVRUUl9OVUxMX1RSRUUoRU5VTSkJCQkJXAog IGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkgRU5VTV0gPSBOVUxMX1RSRUU7 CiNkZWZpbmUgREVGX0FUVFJfSU5UKEVOVU0sIFZBTFVFKQkJCQlcCiAgYnVp bHRfaW5fYXR0cmlidXRlc1soaW50KSBFTlVNXSA9IGJ1aWxkX2ludF9jc3Qg KE5VTExfVFJFRSwgVkFMVUUpOwojZGVmaW5lIERFRl9BVFRSX0lERU5UKEVO VU0sIFNUUklORykJCQkJXAogIGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkg RU5VTV0gPSBnZXRfaWRlbnRpZmllciAoU1RSSU5HKTsKI2RlZmluZSBERUZf QVRUUl9UUkVFX0xJU1QoRU5VTSwgUFVSUE9TRSwgVkFMVUUsIENIQUlOKQlc CiAgYnVpbHRfaW5fYXR0cmlidXRlc1soaW50KSBFTlVNXQkJCVwKICAgID0g dHJlZV9jb25zIChidWlsdF9pbl9hdHRyaWJ1dGVzWyhpbnQpIFBVUlBPU0Vd LAlcCgkJIGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkgVkFMVUVdLAlcCgkJ IGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkgQ0hBSU5dKTsKI2luY2x1ZGUg ImJ1aWx0aW4tYXR0cnMuZGVmIgojdW5kZWYgREVGX0FUVFJfTlVMTF9UUkVF CiN1bmRlZiBERUZfQVRUUl9JTlQKI3VuZGVmIERFRl9BVFRSX0lERU5UCiN1 bmRlZiBERUZfQVRUUl9UUkVFX0xJU1QKfQoKLyogQXR0cmlidXRlIGhhbmRs ZXJzIGNvbW1vbiB0byBDIGZyb250IGVuZHMuICAqLwoKLyogSGFuZGxlIGEg InBhY2tlZCIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0 IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFu ZGxlX3BhY2tlZF9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwg dHJlZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkJIGludCBmbGFncywgYm9vbCAq bm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRZUEVfUCAoKm5vZGUpKQogICAgewog ICAgICBpZiAoIShmbGFncyAmIChpbnQpIEFUVFJfRkxBR19UWVBFX0lOX1BM QUNFKSkKCSpub2RlID0gYnVpbGRfdmFyaWFudF90eXBlX2NvcHkgKCpub2Rl KTsKICAgICAgVFlQRV9QQUNLRUQgKCpub2RlKSA9IDE7CiAgICB9CiAgZWxz ZSBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRklFTERfREVDTCkKICAgIHsK ICAgICAgaWYgKFRZUEVfQUxJR04gKFRSRUVfVFlQRSAoKm5vZGUpKSA8PSBC SVRTX1BFUl9VTklUKQoJd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLAoJCSAi JXFFIGF0dHJpYnV0ZSBpZ25vcmVkIGZvciBmaWVsZCBvZiB0eXBlICVxVCIs CgkJIG5hbWUsIFRSRUVfVFlQRSAoKm5vZGUpKTsKICAgICAgZWxzZQoJREVD TF9QQUNLRUQgKCpub2RlKSA9IDE7CiAgICB9CiAgLyogV2UgY2FuJ3Qgc2V0 IERFQ0xfUEFDS0VEIGZvciBhIFZBUl9ERUNMLCBiZWNhdXNlIHRoZSBiaXQg aXMKICAgICB1c2VkIGZvciBERUNMX1JFR0lTVEVSLiAgSXQgd291bGRuJ3Qg bWVhbiBhbnl0aGluZyBhbnl3YXkuCiAgICAgV2UgY2FuJ3Qgc2V0IERFQ0xf UEFDS0VEIG9uIHRoZSB0eXBlIG9mIGEgVFlQRV9ERUNMLCBiZWNhdXNlCiAg ICAgdGhhdCBjaGFuZ2VzIHdoYXQgdGhlIHR5cGVkZWYgaXMgdHlwaW5nLiAg Ki8KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgIm5vY29tbW9uIiBhdHRyaWJ1dGU7IGFyZ3VtZW50 cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICov CgpzdGF0aWMgdHJlZQpoYW5kbGVfbm9jb21tb25fYXR0cmlidXRlICh0cmVl ICpub2RlLCB0cmVlIG5hbWUsCgkJCSAgIHRyZWUgQVJHX1VOVVNFRCAoYXJn cyksCgkJCSAgIGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2Fk ZF9hdHRycykKewogIGlmIChUUkVFX0NPREUgKCpub2RlKSA9PSBWQVJfREVD TCkKICAgIERFQ0xfQ09NTU9OICgqbm9kZSkgPSAwOwogIGVsc2UKICAgIHsK ICAgICAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0 ZSBpZ25vcmVkIiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVl OwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAi Y29tbW9uIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3Qg YXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5k bGVfY29tbW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0 cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkgaW50IEFSR19VTlVTRUQgKGZs YWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAo Km5vZGUpID09IFZBUl9ERUNMKQogICAgREVDTF9DT01NT04gKCpub2RlKSA9 IDE7CiAgZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0 ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5v X2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7 Cn0KCi8qIEhhbmRsZSBhICJub3JldHVybiIgYXR0cmlidXRlOyBhcmd1bWVu dHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAq LwoKc3RhdGljIHRyZWUKaGFuZGxlX25vcmV0dXJuX2F0dHJpYnV0ZSAodHJl ZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJ CQkgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLCBib29sICpub19hZGRfYXR0 cnMpCnsKICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKCpub2RlKTsKCiAgLyog U2VlIEZJWE1FIGNvbW1lbnQgaW4gY19jb21tb25fYXR0cmlidXRlX3RhYmxl LiAgKi8KICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVD TCkKICAgIFRSRUVfVEhJU19WT0xBVElMRSAoKm5vZGUpID0gMTsKICBlbHNl IGlmIChUUkVFX0NPREUgKHR5cGUpID09IFBPSU5URVJfVFlQRQoJICAgJiYg VFJFRV9DT0RFIChUUkVFX1RZUEUgKHR5cGUpKSA9PSBGVU5DVElPTl9UWVBF KQogICAgVFJFRV9UWVBFICgqbm9kZSkKICAgICAgPSBidWlsZF9wb2ludGVy X3R5cGUKCShidWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAodHlwZSks CgkJCSAgICAgVFlQRV9SRUFET05MWSAoVFJFRV9UWVBFICh0eXBlKSksIDEp KTsKICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgImhvdCIgYW5kIGF0dHJpYnV0ZTsgYXJndW1lbnRz IGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8K CnN0YXRpYyB0cmVlCmhhbmRsZV9ob3RfYXR0cmlidXRlICh0cmVlICpub2Rl LCB0cmVlIG5hbWUsIHRyZWUgQVJHX1VOVVNFRCAoYXJncyksCgkJCSAgaW50 IEFSR19VTlVTRUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAg aWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICB7 CiAgICAgIGlmIChsb29rdXBfYXR0cmlidXRlICgiY29sZCIsIERFQ0xfQVRU UklCVVRFUyAoKm5vZGUpKSAhPSBOVUxMKQoJewoJICB3YXJuaW5nIChPUFRf V2F0dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGNvbmZsaWN0cyB3aXRoIGF0 dHJpYnV0ZSAlcyIsCgkJICAgbmFtZSwgImNvbGQiKTsKCSAgKm5vX2FkZF9h dHRycyA9IHRydWU7Cgl9CiAgICAgIC8qIERvIG5vdGhpbmcgZWxzZSwganVz dCBzZXQgdGhlIGF0dHJpYnV0ZS4gIFdlJ2xsIGdldCBhdAoJIGl0IGxhdGVy IHdpdGggbG9va3VwX2F0dHJpYnV0ZS4gICovCiAgICB9CiAgZWxzZQogICAg ewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmli dXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRy dWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KLyogSGFuZGxlIGEg ImNvbGQiIGFuZCBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1 Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpo YW5kbGVfY29sZF9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwg dHJlZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkgICAgICAgaW50IEFSR19VTlVT RUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVf Q09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICB7CiAgICAgIGlm IChsb29rdXBfYXR0cmlidXRlICgiaG90IiwgREVDTF9BVFRSSUJVVEVTICgq bm9kZSkpICE9IE5VTEwpCgl7CgkgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgY29uZmxpY3RzIHdpdGggYXR0cmlidXRlICVz IiwKCQkgICBuYW1lLCAiaG90Iik7CgkgICpub19hZGRfYXR0cnMgPSB0cnVl OwoJfQogICAgICAvKiBEbyBub3RoaW5nIGVsc2UsIGp1c3Qgc2V0IHRoZSBh dHRyaWJ1dGUuICBXZSdsbCBnZXQgYXQKCSBpdCBsYXRlciB3aXRoIGxvb2t1 cF9hdHRyaWJ1dGUuICAqLwogICAgfQogIGVsc2UKICAgIHsKICAgICAgd2Fy bmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVk IiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoK ICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAibm9pbmxpbmUi IGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1 dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9ub2lu bGluZV9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkJICAg dHJlZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkJICAgaW50IEFSR19VTlVTRUQg KGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09E RSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICBERUNMX1VOSU5MSU5B QkxFICgqbm9kZSkgPSAxOwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAo T1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFt ZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1 cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAiYWx3YXlzX2lubGluZSIg YXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0 ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX2Fsd2F5 c19pbmxpbmVfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJ CQl0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkJaW50IEFSR19VTlVTRUQg KGZsYWdzKSwKCQkJCWJvb2wgKm5vX2FkZF9hdHRycykKewogIGlmIChUUkVF X0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKQogICAgewogICAgICAv KiBTZXQgdGhlIGF0dHJpYnV0ZSBhbmQgbWFyayBpdCBmb3IgZGlzcmVnYXJk aW5nIGlubGluZQoJIGxpbWl0cy4gICovCiAgICAgIERFQ0xfRElTUkVHQVJE X0lOTElORV9MSU1JVFMgKCpub2RlKSA9IDE7CiAgICB9CiAgZWxzZQogICAg ewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmli dXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRy dWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBh ICJnbnVfaW5saW5lIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBz dHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJl ZQpoYW5kbGVfZ251X2lubGluZV9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRy ZWUgbmFtZSwKCQkJICAgICB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkg ICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksCgkJCSAgICAgYm9vbCAqbm9f YWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNU SU9OX0RFQ0wgJiYgREVDTF9ERUNMQVJFRF9JTkxJTkVfUCAoKm5vZGUpKQog ICAgewogICAgICAvKiBEbyBub3RoaW5nIGVsc2UsIGp1c3Qgc2V0IHRoZSBh dHRyaWJ1dGUuICBXZSdsbCBnZXQgYXQKCSBpdCBsYXRlciB3aXRoIGxvb2t1 cF9hdHRyaWJ1dGUuICAqLwogICAgfQogIGVsc2UKICAgIHsKICAgICAgd2Fy bmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVk IiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoK ICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYW4gImFydGlmaWNp YWwiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRy aWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9h cnRpZmljaWFsX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLAoJ CQkgICAgIHRyZWUgQVJHX1VOVVNFRCAoYXJncyksCgkJCSAgICAgaW50IEFS R19VTlVTRUQgKGZsYWdzKSwKCQkJICAgICBib29sICpub19hZGRfYXR0cnMp CnsKICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVDTCAm JiBERUNMX0RFQ0xBUkVEX0lOTElORV9QICgqbm9kZSkpCiAgICB7CiAgICAg IC8qIERvIG5vdGhpbmcgZWxzZSwganVzdCBzZXQgdGhlIGF0dHJpYnV0ZS4g IFdlJ2xsIGdldCBhdAoJIGl0IGxhdGVyIHdpdGggbG9va3VwX2F0dHJpYnV0 ZS4gICovCiAgICB9CiAgZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRf V2F0dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsK ICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBO VUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJmbGF0dGVuIiBhdHRyaWJ1dGU7 IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFu ZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfZmxhdHRlbl9hdHRyaWJ1 dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkJICB0cmVlIGFyZ3MgQVRU UklCVVRFX1VOVVNFRCwKCQkJICBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNF RCwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAoKm5v ZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICAvKiBEbyBub3RoaW5nIGVsc2Us IGp1c3Qgc2V0IHRoZSBhdHRyaWJ1dGUuICBXZSdsbCBnZXQgYXQKICAgICAg IGl0IGxhdGVyIHdpdGggbG9va3VwX2F0dHJpYnV0ZS4gICovCiAgICA7CiAg ZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIl cUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9h dHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8q IEhhbmRsZSBhICJ3YXJuaW5nIiBvciAiZXJyb3IiIGF0dHJpYnV0ZTsgYXJn dW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVy LiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9lcnJvcl9hdHRyaWJ1dGUgKHRy ZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzLAoJCQlpbnQgQVJHX1VO VVNFRCAoZmxhZ3MpLCBib29sICpub19hZGRfYXR0cnMpCnsKICBpZiAoVFJF RV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVDTAogICAgICB8fCBUUkVF X0NPREUgKFRSRUVfVkFMVUUgKGFyZ3MpKSA9PSBTVFJJTkdfQ1NUKQogICAg LyogRG8gbm90aGluZyBlbHNlLCBqdXN0IHNldCB0aGUgYXR0cmlidXRlLiAg V2UnbGwgZ2V0IGF0CiAgICAgICBpdCBsYXRlciB3aXRoIGxvb2t1cF9hdHRy aWJ1dGUuICAqLwogICAgOwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAo T1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFt ZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1 cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAidXNlZCIgYXR0cmlidXRl OyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhh bmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX3VzZWRfYXR0cmlidXRl ICh0cmVlICpwbm9kZSwgdHJlZSBuYW1lLCB0cmVlIEFSR19VTlVTRUQgKGFy Z3MpLAoJCSAgICAgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLCBib29sICpu b19hZGRfYXR0cnMpCnsKICB0cmVlIG5vZGUgPSAqcG5vZGU7CgogIGlmIChU UkVFX0NPREUgKG5vZGUpID09IEZVTkNUSU9OX0RFQ0wKICAgICAgfHwgKFRS RUVfQ09ERSAobm9kZSkgPT0gVkFSX0RFQ0wgJiYgVFJFRV9TVEFUSUMgKG5v ZGUpKSkKICAgIHsKICAgICAgVFJFRV9VU0VEIChub2RlKSA9IDE7CiAgICAg IERFQ0xfUFJFU0VSVkVfUCAobm9kZSkgPSAxOwogICAgfQogIGVsc2UKICAg IHsKICAgICAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJp YnV0ZSBpZ25vcmVkIiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0 cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUg YSAidW51c2VkIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1 Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpo YW5kbGVfdW51c2VkX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1l LCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkgaW50IGZsYWdzLCBib29s ICpub19hZGRfYXR0cnMpCnsKICBpZiAoREVDTF9QICgqbm9kZSkpCiAgICB7 CiAgICAgIHRyZWUgZGVjbCA9ICpub2RlOwoKICAgICAgaWYgKFRSRUVfQ09E RSAoZGVjbCkgPT0gUEFSTV9ERUNMCgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkg PT0gVkFSX0RFQ0wKCSAgfHwgVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElP Tl9ERUNMCgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gTEFCRUxfREVDTAoJ ICB8fCBUUkVFX0NPREUgKGRlY2wpID09IFRZUEVfREVDTCkKCVRSRUVfVVNF RCAoZGVjbCkgPSAxOwogICAgICBlbHNlCgl7CgkgIHdhcm5pbmcgKE9QVF9X YXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwoJ ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCX0KICAgIH0KICBlbHNlCiAgICB7 CiAgICAgIGlmICghKGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZUEVfSU5f UExBQ0UpKQoJKm5vZGUgPSBidWlsZF92YXJpYW50X3R5cGVfY29weSAoKm5v ZGUpOwogICAgICBUUkVFX1VTRUQgKCpub2RlKSA9IDE7CiAgICB9CgogIHJl dHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJleHRlcm5hbGx5X3Zp c2libGUiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBh dHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRs ZV9leHRlcm5hbGx5X3Zpc2libGVfYXR0cmlidXRlICh0cmVlICpwbm9kZSwg dHJlZSBuYW1lLAoJCQkJICAgICB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJ CQkJICAgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkJICAgICBib29s ICpub19hZGRfYXR0cnMpCnsKICB0cmVlIG5vZGUgPSAqcG5vZGU7CgogIGlm IChUUkVFX0NPREUgKG5vZGUpID09IEZVTkNUSU9OX0RFQ0wgfHwgVFJFRV9D T0RFIChub2RlKSA9PSBWQVJfREVDTCkKICAgIHsKICAgICAgaWYgKCghVFJF RV9TVEFUSUMgKG5vZGUpICYmIFRSRUVfQ09ERSAobm9kZSkgIT0gRlVOQ1RJ T05fREVDTAoJICAgJiYgIURFQ0xfRVhURVJOQUwgKG5vZGUpKSB8fCAhVFJF RV9QVUJMSUMgKG5vZGUpKQoJewoJICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0 ZXMsCgkJICAgIiVxRSBhdHRyaWJ1dGUgaGF2ZSBlZmZlY3Qgb25seSBvbiBw dWJsaWMgb2JqZWN0cyIsIG5hbWUpOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1 ZTsKCX0KICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9X YXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwog ICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5V TExfVFJFRTsKfQoKLyogSGFuZGxlIGEgImNvbnN0IiBhdHRyaWJ1dGU7IGFy Z3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxl ci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfY29uc3RfYXR0cmlidXRlICh0 cmVlICpub2RlLCB0cmVlIG5hbWUsIHRyZWUgQVJHX1VOVVNFRCAoYXJncyks CgkJCWludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRy cykKewogIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoKm5vZGUpOwoKICAvKiBT ZWUgRklYTUUgY29tbWVudCBvbiBub3JldHVybiBpbiBjX2NvbW1vbl9hdHRy aWJ1dGVfdGFibGUuICAqLwogIGlmIChUUkVFX0NPREUgKCpub2RlKSA9PSBG VU5DVElPTl9ERUNMKQogICAgVFJFRV9SRUFET05MWSAoKm5vZGUpID0gMTsK ICBlbHNlIGlmIChUUkVFX0NPREUgKHR5cGUpID09IFBPSU5URVJfVFlQRQoJ ICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKHR5cGUpKSA9PSBGVU5DVElP Tl9UWVBFKQogICAgVFJFRV9UWVBFICgqbm9kZSkKICAgICAgPSBidWlsZF9w b2ludGVyX3R5cGUKCShidWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAo dHlwZSksIDEsCgkJCSAgICAgVFJFRV9USElTX1ZPTEFUSUxFIChUUkVFX1RZ UEUgKHR5cGUpKSkpOwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAoT1BU X1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFtZSk7 CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4g TlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAidHJhbnNwYXJlbnRfdW5pb24i IGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1 dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV90cmFu c3BhcmVudF91bmlvbl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFt ZSwKCQkJCSAgICB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLCBpbnQgZmxhZ3Ms CgkJCQkgICAgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSB0eXBlOwoK ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCiAgaWYgKFRSRUVfQ09ERSAoKm5v ZGUpID09IFRZUEVfREVDTCkKICAgIG5vZGUgPSAmVFJFRV9UWVBFICgqbm9k ZSk7CiAgdHlwZSA9ICpub2RlOwoKICBpZiAoVFJFRV9DT0RFICh0eXBlKSA9 PSBVTklPTl9UWVBFKQogICAgewogICAgICAvKiBXaGVuIElOX1BMQUNFIGlz IHNldCwgbGVhdmUgdGhlIGNoZWNrIGZvciBGSUVMRFMgYW5kIE1PREUgdG8K CSB0aGUgY29kZSBpbiBmaW5pc2hfc3RydWN0LiAgKi8KICAgICAgaWYgKCEo ZmxhZ3MgJiAoaW50KSBBVFRSX0ZMQUdfVFlQRV9JTl9QTEFDRSkpCgl7Cgkg IGlmIChUWVBFX0ZJRUxEUyAodHlwZSkgPT0gTlVMTF9UUkVFCgkgICAgICB8 fCBUWVBFX01PREUgKHR5cGUpICE9IERFQ0xfTU9ERSAoVFlQRV9GSUVMRFMg KHR5cGUpKSkKCSAgICBnb3RvIGlnbm9yZWQ7CgoJICAvKiBBIHR5cGUgdmFy aWFudCBpc24ndCBnb29kIGVub3VnaCwgc2luY2Ugd2UgZG9uJ3QgYSBjYXN0 CgkgICAgIHRvIHN1Y2ggYSB0eXBlIHJlbW92ZWQgYXMgYSBuby1vcC4gICov CgkgICpub2RlID0gdHlwZSA9IGJ1aWxkX2R1cGxpY2F0ZV90eXBlICh0eXBl KTsKCX0KCiAgICAgIFRZUEVfVFJBTlNQQVJFTlRfVU5JT04gKHR5cGUpID0g MTsKICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiBpZ25vcmVkOgog IHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdu b3JlZCIsIG5hbWUpOwogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIFN1YnJv dXRpbmUgb2YgaGFuZGxlX3tjb24sZGV9c3RydWN0b3JfYXR0cmlidXRlLiAg RXZhbHVhdGUgQVJHUyB0bwogICBnZXQgdGhlIHJlcXVlc3RlZCBwcmlvcml0 eSBmb3IgYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLAogICBwb3NzaWJs eSBpc3N1aW5nIGRpYWdub3N0aWNzIGZvciBpbnZhbGlkIG9yIHJlc2VydmVk CiAgIHByaW9yaXRpZXMuICAqLwoKc3RhdGljIHByaW9yaXR5X3R5cGUKZ2V0 X3ByaW9yaXR5ICh0cmVlIGFyZ3MsIGJvb2wgaXNfZGVzdHJ1Y3RvcikKewog IEhPU1RfV0lERV9JTlQgcHJpOwogIHRyZWUgYXJnOwoKICBpZiAoIWFyZ3Mp CiAgICByZXR1cm4gREVGQVVMVF9JTklUX1BSSU9SSVRZOwogIAogIGlmICgh U1VQUE9SVFNfSU5JVF9QUklPUklUWSkKICAgIHsKICAgICAgaWYgKGlzX2Rl c3RydWN0b3IpCgllcnJvciAoImRlc3RydWN0b3IgcHJpb3JpdGllcyBhcmUg bm90IHN1cHBvcnRlZCIpOwogICAgICBlbHNlCgllcnJvciAoImNvbnN0cnVj dG9yIHByaW9yaXRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgcmV0 dXJuIERFRkFVTFRfSU5JVF9QUklPUklUWTsKICAgIH0KCiAgYXJnID0gVFJF RV9WQUxVRSAoYXJncyk7CiAgaWYgKCFob3N0X2ludGVnZXJwIChhcmcsIC8q cG9zPSovMCkKICAgICAgfHwgIUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBF IChhcmcpKSkKICAgIGdvdG8gaW52YWxpZDsKCiAgcHJpID0gdHJlZV9sb3df Y3N0IChUUkVFX1ZBTFVFIChhcmdzKSwgLypwb3M9Ki8wKTsKICBpZiAocHJp IDwgMCB8fCBwcmkgPiBNQVhfSU5JVF9QUklPUklUWSkKICAgIGdvdG8gaW52 YWxpZDsKCiAgaWYgKHByaSA8PSBNQVhfUkVTRVJWRURfSU5JVF9QUklPUklU WSkKICAgIHsKICAgICAgaWYgKGlzX2Rlc3RydWN0b3IpCgl3YXJuaW5nICgw LAoJCSAiZGVzdHJ1Y3RvciBwcmlvcml0aWVzIGZyb20gMCB0byAlZCBhcmUg cmVzZXJ2ZWQgIgoJCSAiZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiIsIAoJCSBN QVhfUkVTRVJWRURfSU5JVF9QUklPUklUWSk7CiAgICAgIGVsc2UKCXdhcm5p bmcgKDAsCgkJICJjb25zdHJ1Y3RvciBwcmlvcml0aWVzIGZyb20gMCB0byAl ZCBhcmUgcmVzZXJ2ZWQgIgoJCSAiZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiIs IAoJCSBNQVhfUkVTRVJWRURfSU5JVF9QUklPUklUWSk7CiAgICB9CiAgcmV0 dXJuIHByaTsKCiBpbnZhbGlkOgogIGlmIChpc19kZXN0cnVjdG9yKQogICAg ZXJyb3IgKCJkZXN0cnVjdG9yIHByaW9yaXRpZXMgbXVzdCBiZSBpbnRlZ2Vy cyBmcm9tIDAgdG8gJWQgaW5jbHVzaXZlIiwKCSAgIE1BWF9JTklUX1BSSU9S SVRZKTsKICBlbHNlCiAgICBlcnJvciAoImNvbnN0cnVjdG9yIHByaW9yaXRp ZXMgbXVzdCBiZSBpbnRlZ2VycyBmcm9tIDAgdG8gJWQgaW5jbHVzaXZlIiwK CSAgIE1BWF9JTklUX1BSSU9SSVRZKTsKICByZXR1cm4gREVGQVVMVF9JTklU X1BSSU9SSVRZOwp9CgovKiBIYW5kbGUgYSAiY29uc3RydWN0b3IiIGF0dHJp YnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3Bl Yy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9jb25zdHJ1Y3Rv cl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdz LAoJCQkgICAgICBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkgICAgICBi b29sICpub19hZGRfYXR0cnMpCnsKICB0cmVlIGRlY2wgPSAqbm9kZTsKICB0 cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGRlY2wpOwoKICBpZiAoVFJFRV9DT0RF IChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCiAgICAgICYmIFRSRUVfQ09ERSAo dHlwZSkgPT0gRlVOQ1RJT05fVFlQRQogICAgICAmJiBkZWNsX2Z1bmN0aW9u X2NvbnRleHQgKGRlY2wpID09IDApCiAgICB7CiAgICAgIHByaW9yaXR5X3R5 cGUgcHJpb3JpdHk7CiAgICAgIERFQ0xfU1RBVElDX0NPTlNUUlVDVE9SIChk ZWNsKSA9IDE7CiAgICAgIHByaW9yaXR5ID0gZ2V0X3ByaW9yaXR5IChhcmdz LCAvKmlzX2Rlc3RydWN0b3I9Ki9mYWxzZSk7CiAgICAgIFNFVF9ERUNMX0lO SVRfUFJJT1JJVFkgKGRlY2wsIHByaW9yaXR5KTsKICAgICAgVFJFRV9VU0VE IChkZWNsKSA9IDE7CiAgICB9CiAgZWxzZQogICAgewogICAgICB3YXJuaW5n IChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBu YW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJl dHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJkZXN0cnVjdG9yIiBh dHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRl X3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfZGVzdHJ1 Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBh cmdzLAoJCQkgICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksCgkJCSAgICAg Ym9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CiAg dHJlZSB0eXBlID0gVFJFRV9UWVBFIChkZWNsKTsKCiAgaWYgKFRSRUVfQ09E RSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTAogICAgICAmJiBUUkVFX0NPREUg KHR5cGUpID09IEZVTkNUSU9OX1RZUEUKICAgICAgJiYgZGVjbF9mdW5jdGlv bl9jb250ZXh0IChkZWNsKSA9PSAwKQogICAgewogICAgICBwcmlvcml0eV90 eXBlIHByaW9yaXR5OwogICAgICBERUNMX1NUQVRJQ19ERVNUUlVDVE9SIChk ZWNsKSA9IDE7CiAgICAgIHByaW9yaXR5ID0gZ2V0X3ByaW9yaXR5IChhcmdz LCAvKmlzX2Rlc3RydWN0b3I9Ki90cnVlKTsKICAgICAgU0VUX0RFQ0xfRklO SV9QUklPUklUWSAoZGVjbCwgcHJpb3JpdHkpOwogICAgICBUUkVFX1VTRUQg KGRlY2wpID0gMTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcg KE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5h bWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0 dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm1vZGUiIGF0dHJpYnV0 ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5o YW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9tb2RlX2F0dHJpYnV0 ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MsCgkJICAgICAg IGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykK ewogIHRyZWUgdHlwZSA9ICpub2RlOwoKICAqbm9fYWRkX2F0dHJzID0gdHJ1 ZTsKCiAgaWYgKFRSRUVfQ09ERSAoVFJFRV9WQUxVRSAoYXJncykpICE9IElE RU5USUZJRVJfTk9ERSkKICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywg IiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogIGVsc2UKICAgIHsK ICAgICAgaW50IGo7CiAgICAgIGNvbnN0IGNoYXIgKnAgPSBJREVOVElGSUVS X1BPSU5URVIgKFRSRUVfVkFMVUUgKGFyZ3MpKTsKICAgICAgaW50IGxlbiA9 IHN0cmxlbiAocCk7CiAgICAgIGVudW0gbWFjaGluZV9tb2RlIG1vZGUgPSBW T0lEbW9kZTsKICAgICAgdHJlZSB0eXBlZm07CiAgICAgIGJvb2wgdmFsaWRf bW9kZTsKCiAgICAgIGlmIChsZW4gPiA0ICYmIHBbMF0gPT0gJ18nICYmIHBb MV0gPT0gJ18nCgkgICYmIHBbbGVuIC0gMV0gPT0gJ18nICYmIHBbbGVuIC0g Ml0gPT0gJ18nKQoJewoJICBjaGFyICpuZXdwID0gKGNoYXIgKikgYWxsb2Nh IChsZW4gLSAxKTsKCgkgIHN0cmNweSAobmV3cCwgJnBbMl0pOwoJICBuZXdw W2xlbiAtIDRdID0gJ1wwJzsKCSAgcCA9IG5ld3A7Cgl9CgogICAgICAvKiBD aGFuZ2UgdGhpcyB0eXBlIHRvIGhhdmUgYSB0eXBlIHdpdGggdGhlIHNwZWNp ZmllZCBtb2RlLgoJIEZpcnN0IGNoZWNrIGZvciB0aGUgc3BlY2lhbCBtb2Rl cy4gICovCiAgICAgIGlmICghc3RyY21wIChwLCAiYnl0ZSIpKQoJbW9kZSA9 IGJ5dGVfbW9kZTsKICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocCwgIndvcmQi KSkKCW1vZGUgPSB3b3JkX21vZGU7CiAgICAgIGVsc2UgaWYgKCFzdHJjbXAg KHAsICJwb2ludGVyIikpCgltb2RlID0gcHRyX21vZGU7CiAgICAgIGVsc2Ug aWYgKCFzdHJjbXAgKHAsICJsaWJnY2NfY21wX3JldHVybiIpKQoJbW9kZSA9 IHRhcmdldG0ubGliZ2NjX2NtcF9yZXR1cm5fbW9kZSAoKTsKICAgICAgZWxz ZSBpZiAoIXN0cmNtcCAocCwgImxpYmdjY19zaGlmdF9jb3VudCIpKQoJbW9k ZSA9IHRhcmdldG0ubGliZ2NjX3NoaWZ0X2NvdW50X21vZGUgKCk7CiAgICAg IGVsc2UKCWZvciAoaiA9IDA7IGogPCBOVU1fTUFDSElORV9NT0RFUzsgaisr KQoJICBpZiAoIXN0cmNtcCAocCwgR0VUX01PREVfTkFNRSAoaikpKQoJICAg IHsKCSAgICAgIG1vZGUgPSAoZW51bSBtYWNoaW5lX21vZGUpIGo7CgkgICAg ICBicmVhazsKCSAgICB9CgogICAgICBpZiAobW9kZSA9PSBWT0lEbW9kZSkK CXsKCSAgZXJyb3IgKCJ1bmtub3duIG1hY2hpbmUgbW9kZSAlcXMiLCBwKTsK CSAgcmV0dXJuIE5VTExfVFJFRTsKCX0KCiAgICAgIHZhbGlkX21vZGUgPSBm YWxzZTsKICAgICAgc3dpdGNoIChHRVRfTU9ERV9DTEFTUyAobW9kZSkpCgl7 CgljYXNlIE1PREVfSU5UOgoJY2FzZSBNT0RFX1BBUlRJQUxfSU5UOgoJY2Fz ZSBNT0RFX0ZMT0FUOgoJY2FzZSBNT0RFX0RFQ0lNQUxfRkxPQVQ6CgljYXNl IE1PREVfRlJBQ1Q6CgljYXNlIE1PREVfVUZSQUNUOgoJY2FzZSBNT0RFX0FD Q1VNOgoJY2FzZSBNT0RFX1VBQ0NVTToKCSAgdmFsaWRfbW9kZSA9IHRhcmdl dG0uc2NhbGFyX21vZGVfc3VwcG9ydGVkX3AgKG1vZGUpOwoJICBicmVhazsK CgljYXNlIE1PREVfQ09NUExFWF9JTlQ6CgljYXNlIE1PREVfQ09NUExFWF9G TE9BVDoKCSAgdmFsaWRfbW9kZSA9IHRhcmdldG0uc2NhbGFyX21vZGVfc3Vw cG9ydGVkX3AgKEdFVF9NT0RFX0lOTkVSIChtb2RlKSk7CgkgIGJyZWFrOwoK CWNhc2UgTU9ERV9WRUNUT1JfSU5UOgoJY2FzZSBNT0RFX1ZFQ1RPUl9GTE9B VDoKCWNhc2UgTU9ERV9WRUNUT1JfRlJBQ1Q6CgljYXNlIE1PREVfVkVDVE9S X1VGUkFDVDoKCWNhc2UgTU9ERV9WRUNUT1JfQUNDVU06CgljYXNlIE1PREVf VkVDVE9SX1VBQ0NVTToKCSAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAi c3BlY2lmeWluZyB2ZWN0b3IgdHlwZXMgd2l0aCAiCgkJICAgIl9fYXR0cmli dXRlX18gKChtb2RlKSkgaXMgZGVwcmVjYXRlZCIpOwoJICB3YXJuaW5nIChP UFRfV2F0dHJpYnV0ZXMsCgkJICAgInVzZSBfX2F0dHJpYnV0ZV9fICgodmVj dG9yX3NpemUpKSBpbnN0ZWFkIik7CgkgIHZhbGlkX21vZGUgPSB2ZWN0b3Jf bW9kZV92YWxpZF9wIChtb2RlKTsKCSAgYnJlYWs7CgoJZGVmYXVsdDoKCSAg YnJlYWs7Cgl9CiAgICAgIGlmICghdmFsaWRfbW9kZSkKCXsKCSAgZXJyb3Ig KCJ1bmFibGUgdG8gZW11bGF0ZSAlcXMiLCBwKTsKCSAgcmV0dXJuIE5VTExf VFJFRTsKCX0KCiAgICAgIGlmIChQT0lOVEVSX1RZUEVfUCAodHlwZSkpCgl7 CgkgIHRyZWUgKCpmbikodHJlZSwgZW51bSBtYWNoaW5lX21vZGUsIGJvb2wp OwoKCSAgaWYgKCF0YXJnZXRtLnZhbGlkX3BvaW50ZXJfbW9kZSAobW9kZSkp CgkgICAgewoJICAgICAgZXJyb3IgKCJpbnZhbGlkIHBvaW50ZXIgbW9kZSAl cXMiLCBwKTsKCSAgICAgIHJldHVybiBOVUxMX1RSRUU7CgkgICAgfQoKCSAg aWYgKFRSRUVfQ09ERSAodHlwZSkgPT0gUE9JTlRFUl9UWVBFKQoJICAgIGZu ID0gYnVpbGRfcG9pbnRlcl90eXBlX2Zvcl9tb2RlOwoJICBlbHNlCgkgICAg Zm4gPSBidWlsZF9yZWZlcmVuY2VfdHlwZV9mb3JfbW9kZTsKCSAgdHlwZWZt ID0gZm4gKFRSRUVfVFlQRSAodHlwZSksIG1vZGUsIGZhbHNlKTsKCX0KICAg ICAgZWxzZQoJewoJICAvKiBGb3IgZml4ZWQtcG9pbnQgbW9kZXMsIHdlIG5l ZWQgdG8gdGVzdCBpZiB0aGUgc2lnbm5lc3Mgb2YgdHlwZQoJICAgICBhbmQg dGhlIG1hY2hpbmUgbW9kZSBhcmUgY29uc2lzdGVudC4gICovCgkgIGlmIChB TExfRklYRURfUE9JTlRfTU9ERV9QIChtb2RlKQoJICAgICAgJiYgVFlQRV9V TlNJR05FRCAodHlwZSkgIT0gVU5TSUdORURfRklYRURfUE9JTlRfTU9ERV9Q IChtb2RlKSkKCSAgICB7CgkgICAgICBlcnJvciAoInNpZ25uZXNzIG9mIHR5 cGUgYW5kIG1hY2hpbmUgbW9kZSAlcXMgZG9uJ3QgbWF0Y2giLCBwKTsKCSAg ICAgIHJldHVybiBOVUxMX1RSRUU7CgkgICAgfQoJICAvKiBGb3IgZml4ZWQt cG9pbnQgbW9kZXMsIHdlIG5lZWQgdG8gcGFzcyBzYXR1cmF0aW5nIGluZm8u ICAqLwoJICB0eXBlZm0gPSBsYW5nX2hvb2tzLnR5cGVzLnR5cGVfZm9yX21v ZGUgKG1vZGUsCgkJCUFMTF9GSVhFRF9QT0lOVF9NT0RFX1AgKG1vZGUpID8g VFlQRV9TQVRVUkFUSU5HICh0eXBlKQoJCQkJCQkgICAgICA6IFRZUEVfVU5T SUdORUQgKHR5cGUpKTsKCX0KCiAgICAgIGlmICh0eXBlZm0gPT0gTlVMTF9U UkVFKQoJewoJICBlcnJvciAoIm5vIGRhdGEgdHlwZSBmb3IgbW9kZSAlcXMi LCBwKTsKCSAgcmV0dXJuIE5VTExfVFJFRTsKCX0KICAgICAgZWxzZSBpZiAo VFJFRV9DT0RFICh0eXBlKSA9PSBFTlVNRVJBTF9UWVBFKQoJewoJICAvKiBG b3IgZW51bWVyYWwgdHlwZXMsIGNvcHkgdGhlIHByZWNpc2lvbiBmcm9tIHRo ZSBpbnRlZ2VyCgkgICAgIHR5cGUgcmV0dXJuZWQgYWJvdmUuICBJZiBub3Qg YW4gSU5URUdFUl9UWVBFLCB3ZSBjYW4ndCB1c2UKCSAgICAgdGhpcyBtb2Rl IGZvciB0aGlzIHR5cGUuICAqLwoJICBpZiAoVFJFRV9DT0RFICh0eXBlZm0p ICE9IElOVEVHRVJfVFlQRSkKCSAgICB7CgkgICAgICBlcnJvciAoImNhbm5v dCB1c2UgbW9kZSAlcXMgZm9yIGVudW1lcmFsIHR5cGVzIiwgcCk7CgkgICAg ICByZXR1cm4gTlVMTF9UUkVFOwoJICAgIH0KCgkgIGlmIChmbGFncyAmIEFU VFJfRkxBR19UWVBFX0lOX1BMQUNFKQoJICAgIHsKCSAgICAgIFRZUEVfUFJF Q0lTSU9OICh0eXBlKSA9IFRZUEVfUFJFQ0lTSU9OICh0eXBlZm0pOwoJICAg ICAgdHlwZWZtID0gdHlwZTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAg ICAvKiBXZSBjYW5ub3QgYnVpbGQgYSB0eXBlIHZhcmlhbnQsIGFzIHRoZXJl J3MgY29kZSB0aGF0IGFzc3VtZXMKCQkgdGhhdCBUWVBFX01BSU5fVkFSSUFO VCBoYXMgdGhlIHNhbWUgbW9kZS4gIFRoaXMgaW5jbHVkZXMgdGhlCgkJIGRl YnVnIGdlbmVyYXRvcnMuICBJbnN0ZWFkLCBjcmVhdGUgYSBzdWJyYW5nZSB0 eXBlLiAgVGhpcwoJCSByZXN1bHRzIGluIGFsbCBvZiB0aGUgZW51bWVyYWwg dmFsdWVzIGJlaW5nIGVtaXR0ZWQgb25seSBvbmNlCgkJIGluIHRoZSBvcmln aW5hbCwgYW5kIHRoZSBzdWJ0eXBlIGdldHMgdGhlbSBieSByZWZlcmVuY2Uu ICAqLwoJICAgICAgaWYgKFRZUEVfVU5TSUdORUQgKHR5cGUpKQoJCXR5cGVm bSA9IG1ha2VfdW5zaWduZWRfdHlwZSAoVFlQRV9QUkVDSVNJT04gKHR5cGVm bSkpOwoJICAgICAgZWxzZQoJCXR5cGVmbSA9IG1ha2Vfc2lnbmVkX3R5cGUg KFRZUEVfUFJFQ0lTSU9OICh0eXBlZm0pKTsKCSAgICAgIFRSRUVfVFlQRSAo dHlwZWZtKSA9IHR5cGU7CgkgICAgfQoJfQogICAgICBlbHNlIGlmIChWRUNU T1JfTU9ERV9QIChtb2RlKQoJICAgICAgID8gVFJFRV9DT0RFICh0eXBlKSAh PSBUUkVFX0NPREUgKFRSRUVfVFlQRSAodHlwZWZtKSkKCSAgICAgICA6IFRS RUVfQ09ERSAodHlwZSkgIT0gVFJFRV9DT0RFICh0eXBlZm0pKQoJewoJICBl cnJvciAoIm1vZGUgJXFzIGFwcGxpZWQgdG8gaW5hcHByb3ByaWF0ZSB0eXBl IiwgcCk7CgkgIHJldHVybiBOVUxMX1RSRUU7Cgl9CgogICAgICAqbm9kZSA9 IHR5cGVmbTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFu ZGxlIGEgInNlY3Rpb24iIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAg IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0 cmVlCmhhbmRsZV9zZWN0aW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJl ZSBBUkdfVU5VU0VEIChuYW1lKSwgdHJlZSBhcmdzLAoJCQkgIGludCBBUkdf VU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUg ZGVjbCA9ICpub2RlOwoKICBpZiAodGFyZ2V0bS5oYXZlX25hbWVkX3NlY3Rp b25zKQogICAgewogICAgICB1c2VyX2RlZmluZWRfc2VjdGlvbl9hdHRyaWJ1 dGUgPSB0cnVlOwoKICAgICAgaWYgKChUUkVFX0NPREUgKGRlY2wpID09IEZV TkNUSU9OX0RFQ0wKCSAgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RF Q0wpCgkgICYmIFRSRUVfQ09ERSAoVFJFRV9WQUxVRSAoYXJncykpID09IFNU UklOR19DU1QpCgl7CgkgIGlmIChUUkVFX0NPREUgKGRlY2wpID09IFZBUl9E RUNMCgkgICAgICAmJiBjdXJyZW50X2Z1bmN0aW9uX2RlY2wgIT0gTlVMTF9U UkVFCgkgICAgICAmJiAhVFJFRV9TVEFUSUMgKGRlY2wpKQoJICAgIHsKCSAg ICAgIGVycm9yICgiJUpzZWN0aW9uIGF0dHJpYnV0ZSBjYW5ub3QgYmUgc3Bl Y2lmaWVkIGZvciAiCgkJICAgICAibG9jYWwgdmFyaWFibGVzIiwgZGVjbCk7 CgkgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAgICB9CgoJICAvKiBU aGUgZGVjbCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gYSBzZWN0aW9u IGF0dHJpYnV0ZQoJICAgICBmcm9tIGEgcHJldmlvdXMgZGVjbGFyYXRpb24u ICBFbnN1cmUgdGhleSBtYXRjaC4gICovCgkgIGVsc2UgaWYgKERFQ0xfU0VD VElPTl9OQU1FIChkZWNsKSAhPSBOVUxMX1RSRUUKCQkgICAmJiBzdHJjbXAg KFRSRUVfU1RSSU5HX1BPSU5URVIgKERFQ0xfU0VDVElPTl9OQU1FIChkZWNs KSksCgkJCSAgICAgIFRSRUVfU1RSSU5HX1BPSU5URVIgKFRSRUVfVkFMVUUg KGFyZ3MpKSkgIT0gMCkKCSAgICB7CgkgICAgICBlcnJvciAoInNlY3Rpb24g b2YgJXErRCBjb25mbGljdHMgd2l0aCBwcmV2aW91cyBkZWNsYXJhdGlvbiIs CgkJICAgICAqbm9kZSk7CgkgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsK CSAgICB9CgkgIGVsc2UKCSAgICBERUNMX1NFQ1RJT05fTkFNRSAoZGVjbCkg PSBUUkVFX1ZBTFVFIChhcmdzKTsKCX0KICAgICAgZWxzZQoJewoJICBlcnJv ciAoInNlY3Rpb24gYXR0cmlidXRlIG5vdCBhbGxvd2VkIGZvciAlcStEIiwg Km5vZGUpOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCX0KICAgIH0KICBl bHNlCiAgICB7CiAgICAgIGVycm9yICgiJUpzZWN0aW9uIGF0dHJpYnV0ZXMg YXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0IiwgKm5vZGUpOwog ICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5V TExfVFJFRTsKfQoKLyogSGFuZGxlIGEgImFsaWduZWQiIGF0dHJpYnV0ZTsg YXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5k bGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9hbGlnbmVkX2F0dHJpYnV0 ZSAodHJlZSAqbm9kZSwgdHJlZSBBUkdfVU5VU0VEIChuYW1lKSwgdHJlZSBh cmdzLAoJCQkgIGludCBmbGFncywgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAg dHJlZSBkZWNsID0gTlVMTF9UUkVFOwogIHRyZWUgKnR5cGUgPSBOVUxMOwog IGludCBpc190eXBlID0gMDsKICB0cmVlIGFsaWduX2V4cHIgPSAoYXJncyA/ IFRSRUVfVkFMVUUgKGFyZ3MpCgkJICAgICA6IHNpemVfaW50IChCSUdHRVNU X0FMSUdOTUVOVCAvIEJJVFNfUEVSX1VOSVQpKTsKICBpbnQgaTsKCiAgaWYg KERFQ0xfUCAoKm5vZGUpKQogICAgewogICAgICBkZWNsID0gKm5vZGU7CiAg ICAgIHR5cGUgPSAmVFJFRV9UWVBFIChkZWNsKTsKICAgICAgaXNfdHlwZSA9 IFRSRUVfQ09ERSAoKm5vZGUpID09IFRZUEVfREVDTDsKICAgIH0KICBlbHNl IGlmIChUWVBFX1AgKCpub2RlKSkKICAgIHR5cGUgPSBub2RlLCBpc190eXBl ID0gMTsKCiAgaWYgKFRSRUVfQ09ERSAoYWxpZ25fZXhwcikgIT0gSU5URUdF Ul9DU1QpCiAgICB7CiAgICAgIGVycm9yICgicmVxdWVzdGVkIGFsaWdubWVu dCBpcyBub3QgYSBjb25zdGFudCIpOwogICAgICAqbm9fYWRkX2F0dHJzID0g dHJ1ZTsKICAgIH0KICBlbHNlIGlmICgoaSA9IHRyZWVfbG9nMiAoYWxpZ25f ZXhwcikpID09IC0xKQogICAgewogICAgICBlcnJvciAoInJlcXVlc3RlZCBh bGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgMiIpOwogICAgICAqbm9fYWRk X2F0dHJzID0gdHJ1ZTsKICAgIH0KICBlbHNlIGlmIChpID4gSE9TVF9CSVRT X1BFUl9JTlQgLSAyKQogICAgewogICAgICBlcnJvciAoInJlcXVlc3RlZCBh bGlnbm1lbnQgaXMgdG9vIGxhcmdlIik7CiAgICAgICpub19hZGRfYXR0cnMg PSB0cnVlOwogICAgfQogIGVsc2UgaWYgKGlzX3R5cGUpCiAgICB7CiAgICAg IC8qIElmIHdlIGhhdmUgYSBUWVBFX0RFQ0wsIHRoZW4gY29weSB0aGUgdHlw ZSwgc28gdGhhdCB3ZQoJIGRvbid0IGFjY2lkZW50YWxseSBtb2RpZnkgYSBi dWlsdGluIHR5cGUuICBTZWUgcHVzaGRlY2wuICAqLwogICAgICBpZiAoZGVj bCAmJiBUUkVFX1RZUEUgKGRlY2wpICE9IGVycm9yX21hcmtfbm9kZQoJICAm JiBERUNMX09SSUdJTkFMX1RZUEUgKGRlY2wpID09IE5VTExfVFJFRSkKCXsK CSAgdHJlZSB0dCA9IFRSRUVfVFlQRSAoZGVjbCk7CgkgICp0eXBlID0gYnVp bGRfdmFyaWFudF90eXBlX2NvcHkgKCp0eXBlKTsKCSAgREVDTF9PUklHSU5B TF9UWVBFIChkZWNsKSA9IHR0OwoJICBUWVBFX05BTUUgKCp0eXBlKSA9IGRl Y2w7CgkgIFRSRUVfVVNFRCAoKnR5cGUpID0gVFJFRV9VU0VEIChkZWNsKTsK CSAgVFJFRV9UWVBFIChkZWNsKSA9ICp0eXBlOwoJfQogICAgICBlbHNlIGlm ICghKGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZUEVfSU5fUExBQ0UpKQoJ KnR5cGUgPSBidWlsZF92YXJpYW50X3R5cGVfY29weSAoKnR5cGUpOwoKICAg ICAgVFlQRV9BTElHTiAoKnR5cGUpID0gKDEgPDwgaSkgKiBCSVRTX1BFUl9V TklUOwogICAgICBUWVBFX1VTRVJfQUxJR04gKCp0eXBlKSA9IDE7CiAgICB9 CiAgZWxzZSBpZiAoISBWQVJfT1JfRlVOQ1RJT05fREVDTF9QIChkZWNsKQoJ ICAgJiYgVFJFRV9DT0RFIChkZWNsKSAhPSBGSUVMRF9ERUNMKQogICAgewog ICAgICBlcnJvciAoImFsaWdubWVudCBtYXkgbm90IGJlIHNwZWNpZmllZCBm b3IgJXErRCIsIGRlY2wpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsK ICAgIH0KICBlbHNlIGlmIChUUkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9O X0RFQ0wKCSAgICYmIERFQ0xfQUxJR04gKGRlY2wpID4gKDEgPDwgaSkgKiBC SVRTX1BFUl9VTklUKQogICAgewogICAgICBpZiAoREVDTF9VU0VSX0FMSUdO IChkZWNsKSkKCWVycm9yICgiYWxpZ25tZW50IGZvciAlcStEIHdhcyBwcmV2 aW91c2x5IHNwZWNpZmllZCBhcyAlZCAiCgkgICAgICAgImFuZCBtYXkgbm90 IGJlIGRlY3JlYXNlZCIsIGRlY2wsCgkgICAgICAgREVDTF9BTElHTiAoZGVj bCkgLyBCSVRTX1BFUl9VTklUKTsKICAgICAgZWxzZQoJZXJyb3IgKCJhbGln bm1lbnQgZm9yICVxK0QgbXVzdCBiZSBhdCBsZWFzdCAlZCIsIGRlY2wsCgkg ICAgICAgREVDTF9BTElHTiAoZGVjbCkgLyBCSVRTX1BFUl9VTklUKTsKICAg ICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CiAgZWxzZQogICAgewog ICAgICBERUNMX0FMSUdOIChkZWNsKSA9ICgxIDw8IGkpICogQklUU19QRVJf VU5JVDsKICAgICAgREVDTF9VU0VSX0FMSUdOIChkZWNsKSA9IDE7CiAgICB9 CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJ3ZWFrIiBh dHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRl X3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfd2Vha19h dHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkgICAgICAgdHJl ZSBBUkdfVU5VU0VEIChhcmdzKSwKCQkgICAgICAgaW50IEFSR19VTlVTRUQg KGZsYWdzKSwKCQkgICAgICAgYm9vbCAqIEFSR19VTlVTRUQgKG5vX2FkZF9h dHRycykpCnsKICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05f REVDTAogICAgICB8fCBUUkVFX0NPREUgKCpub2RlKSA9PSBWQVJfREVDTCkK ICAgIGRlY2xhcmVfd2VhayAoKm5vZGUpOwogIGVsc2UKICAgIHdhcm5pbmcg KE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5h bWUpOwogICAgCQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUg YW4gImFsaWFzIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1 Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpo YW5kbGVfYWxpYXNfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUs IHRyZWUgYXJncywKCQkJaW50IEFSR19VTlVTRUQgKGZsYWdzKSwgYm9vbCAq bm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CgogIGlmICgo VFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMICYmIERFQ0xfSU5J VElBTCAoZGVjbCkpCiAgICAgIHx8IChUUkVFX0NPREUgKGRlY2wpICE9IEZV TkNUSU9OX0RFQ0wgCgkgICYmIFRSRUVfUFVCTElDIChkZWNsKSAmJiAhREVD TF9FWFRFUk5BTCAoZGVjbCkpCiAgICAgIC8qIEEgc3RhdGljIHZhcmlhYmxl IGRlY2xhcmF0aW9uIGlzIGFsd2F5cyBhIHRlbnRhdGl2ZSBkZWZpbml0aW9u LAoJIGJ1dCB0aGUgYWxpYXMgaXMgYSBub24tdGVudGF0aXZlIGRlZmluaXRp b24gd2hpY2ggb3ZlcnJpZGVzLiAgKi8KICAgICAgfHwgKFRSRUVfQ09ERSAo ZGVjbCkgIT0gRlVOQ1RJT05fREVDTCAKCSAgJiYgISBUUkVFX1BVQkxJQyAo ZGVjbCkgJiYgREVDTF9JTklUSUFMIChkZWNsKSkpCiAgICB7CiAgICAgIGVy cm9yICgiJXErRCBkZWZpbmVkIGJvdGggbm9ybWFsbHkgYW5kIGFzIGFuIGFs aWFzIiwgZGVjbCk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAg fQoKICAvKiBOb3RlIHRoYXQgdGhlIHZlcnkgZmlyc3QgdGltZSB3ZSBwcm9j ZXNzIGEgbmVzdGVkIGRlY2xhcmF0aW9uLAogICAgIGRlY2xfZnVuY3Rpb25f Y29udGV4dCB3aWxsIG5vdCBiZSBzZXQuICBJbmRlZWQsICp3b3VsZCogbmV2 ZXIKICAgICBiZSBzZXQgZXhjZXB0IGZvciB0aGUgREVDTF9JTklUSUFML0RF Q0xfRVhURVJOQUwgZnJvYmJlcnkgdGhhdAogICAgIHdlIGRvIGJlbG93LiAg QWZ0ZXIgc3VjaCBmcm9iYmVyeSwgcHVzaGRlY2wgd291bGQgc2V0IHRoZSBj b250ZXh0LgogICAgIEluIGFueSBjYXNlLCB0aGlzIGlzIG5ldmVyIHdoYXQg d2Ugd2FudC4gICovCiAgZWxzZSBpZiAoZGVjbF9mdW5jdGlvbl9jb250ZXh0 IChkZWNsKSA9PSAwICYmIGN1cnJlbnRfZnVuY3Rpb25fZGVjbCA9PSBOVUxM KQogICAgewogICAgICB0cmVlIGlkOwoKICAgICAgaWQgPSBUUkVFX1ZBTFVF IChhcmdzKTsKICAgICAgaWYgKFRSRUVfQ09ERSAoaWQpICE9IFNUUklOR19D U1QpCgl7CgkgIGVycm9yICgiYWxpYXMgYXJndW1lbnQgbm90IGEgc3RyaW5n Iik7CgkgICpub19hZGRfYXR0cnMgPSB0cnVlOwoJICByZXR1cm4gTlVMTF9U UkVFOwoJfQogICAgICBpZCA9IGdldF9pZGVudGlmaWVyIChUUkVFX1NUUklO R19QT0lOVEVSIChpZCkpOwogICAgICAvKiBUaGlzIGNvdW50cyBhcyBhIHVz ZSBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8uICAqLwogICAgICBUUkVFX1VT RUQgKGlkKSA9IDE7CgogICAgICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBG VU5DVElPTl9ERUNMKQoJREVDTF9JTklUSUFMIChkZWNsKSA9IGVycm9yX21h cmtfbm9kZTsKICAgICAgZWxzZQoJewoJICBpZiAobG9va3VwX2F0dHJpYnV0 ZSAoIndlYWtyZWYiLCBERUNMX0FUVFJJQlVURVMgKGRlY2wpKSkKCSAgICBE RUNMX0VYVEVSTkFMIChkZWNsKSA9IDE7CgkgIGVsc2UKCSAgICBERUNMX0VY VEVSTkFMIChkZWNsKSA9IDA7CgkgIFRSRUVfU1RBVElDIChkZWNsKSA9IDE7 Cgl9CiAgICB9CiAgZWxzZQogICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0 dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAg ICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxM X1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJ3ZWFrcmVmIiBhdHRyaWJ1dGU7IGFy Z3VtZW50cyBhcyBpbiBzdHJ1Y3QKICAgYXR0cmlidXRlX3NwZWMuaGFuZGxl ci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfd2Vha3JlZl9hdHRyaWJ1dGUg KHRyZWUgKm5vZGUsIHRyZWUgQVJHX1VOVVNFRCAobmFtZSksIHRyZWUgYXJn cywKCQkJICBpbnQgZmxhZ3MsIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRy ZWUgYXR0ciA9IE5VTExfVFJFRTsKCiAgLyogV2UgbXVzdCBpZ25vcmUgdGhl IGF0dHJpYnV0ZSB3aGVuIGl0IGlzIGFzc29jaWF0ZWQgd2l0aAogICAgIGxv Y2FsLXNjb3BlZCBkZWNscywgc2luY2UgYXR0cmlidXRlIGFsaWFzIGlzIGln bm9yZWQgYW5kIG1hbnkKICAgICBzdWNoIHN5bWJvbHMgZG8gbm90IGV2ZW4g aGF2ZSBhIERFQ0xfV0VBSyBmaWVsZC4gICovCiAgaWYgKGRlY2xfZnVuY3Rp b25fY29udGV4dCAoKm5vZGUpIHx8IGN1cnJlbnRfZnVuY3Rpb25fZGVjbCkK ICAgIHsKICAgICAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0 dHJpYnV0ZSBpZ25vcmVkIiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMg PSB0cnVlOwogICAgICByZXR1cm4gTlVMTF9UUkVFOwogICAgfQoKICAvKiBU aGUgaWRlYSBoZXJlIGlzIHRoYXQgYHdlYWtyZWYoIm5hbWUiKScgbXV0YXRl cyBpbnRvIGB3ZWFrcmVmLAogICAgIGFsaWFzKCJuYW1lIiknLCBhbmQgd2Vh a3JlZiB3aXRob3V0IGFyZ3VtZW50cywgaW4gdHVybiwKICAgICBpbXBsaWNp dGx5IGFkZHMgd2Vhay4gKi8KCiAgaWYgKGFyZ3MpCiAgICB7CiAgICAgIGF0 dHIgPSB0cmVlX2NvbnMgKGdldF9pZGVudGlmaWVyICgiYWxpYXMiKSwgYXJn cywgYXR0cik7CiAgICAgIGF0dHIgPSB0cmVlX2NvbnMgKGdldF9pZGVudGlm aWVyICgid2Vha3JlZiIpLCBOVUxMX1RSRUUsIGF0dHIpOwoKICAgICAgKm5v X2FkZF9hdHRycyA9IHRydWU7CgogICAgICBkZWNsX2F0dHJpYnV0ZXMgKG5v ZGUsIGF0dHIsIGZsYWdzKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGlm IChsb29rdXBfYXR0cmlidXRlICgiYWxpYXMiLCBERUNMX0FUVFJJQlVURVMg KCpub2RlKSkpCgllcnJvciAoIiVKd2Vha3JlZiBhdHRyaWJ1dGUgbXVzdCBh cHBlYXIgYmVmb3JlIGFsaWFzIGF0dHJpYnV0ZSIsCgkgICAgICAgKm5vZGUp OwoKICAgICAgLyogQ2FuJ3QgY2FsbCBkZWNsYXJlX3dlYWsgYmVjYXVzZSBp dCB3YW50cyB0aGlzIHRvIGJlIFRSRUVfUFVCTElDLAoJIGFuZCB0aGF0IGlz bid0IHN1cHBvcnRlZDsgYW5kIGJlY2F1c2UgaXQgd2FudHMgdG8gYWRkIGl0 IHRvCgkgdGhlIGxpc3Qgb2Ygd2VhayBkZWNscywgd2hpY2ggaXNuJ3QgaGVs cGZ1bC4gICovCiAgICAgIERFQ0xfV0VBSyAoKm5vZGUpID0gMTsKICAgIH0K CiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGFuICJ2aXNpYmls aXR5IiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0 cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVf dmlzaWJpbGl0eV9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwg dHJlZSBhcmdzLAoJCQkgICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksCgkJ CSAgICAgYm9vbCAqQVJHX1VOVVNFRCAobm9fYWRkX2F0dHJzKSkKewogIHRy ZWUgZGVjbCA9ICpub2RlOwogIHRyZWUgaWQgPSBUUkVFX1ZBTFVFIChhcmdz KTsKICBlbnVtIHN5bWJvbF92aXNpYmlsaXR5IHZpczsKCiAgaWYgKFRZUEVf UCAoKm5vZGUpKQogICAgewogICAgICBpZiAoVFJFRV9DT0RFICgqbm9kZSkg PT0gRU5VTUVSQUxfVFlQRSkKCS8qIE9LICovOwogICAgICBlbHNlIGlmIChU UkVFX0NPREUgKCpub2RlKSAhPSBSRUNPUkRfVFlQRSAmJiBUUkVFX0NPREUg KCpub2RlKSAhPSBVTklPTl9UWVBFKQoJewoJICB3YXJuaW5nIChPUFRfV2F0 dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQgb24gbm9uLWNsYXNz IHR5cGVzIiwKCQkgICBuYW1lKTsKCSAgcmV0dXJuIE5VTExfVFJFRTsKCX0K ICAgICAgZWxzZSBpZiAoVFlQRV9GSUVMRFMgKCpub2RlKSkKCXsKCSAgZXJy b3IgKCIlcUUgYXR0cmlidXRlIGlnbm9yZWQgYmVjYXVzZSAlcVQgaXMgYWxy ZWFkeSBkZWZpbmVkIiwKCQkgbmFtZSwgKm5vZGUpOwoJICByZXR1cm4gTlVM TF9UUkVFOwoJfQogICAgfQogIGVsc2UgaWYgKGRlY2xfZnVuY3Rpb25fY29u dGV4dCAoZGVjbCkgIT0gMCB8fCAhVFJFRV9QVUJMSUMgKGRlY2wpKQogICAg ewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0cmli dXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgcmV0dXJuIE5VTExfVFJFRTsK ICAgIH0KCiAgaWYgKFRSRUVfQ09ERSAoaWQpICE9IFNUUklOR19DU1QpCiAg ICB7CiAgICAgIGVycm9yICgidmlzaWJpbGl0eSBhcmd1bWVudCBub3QgYSBz dHJpbmciKTsKICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiAgLyog IElmIHRoaXMgaXMgYSB0eXBlLCBzZXQgdGhlIHZpc2liaWxpdHkgb24gdGhl IHR5cGUgZGVjbC4gICovCiAgaWYgKFRZUEVfUCAoZGVjbCkpCiAgICB7CiAg ICAgIGRlY2wgPSBUWVBFX05BTUUgKGRlY2wpOwogICAgICBpZiAoIWRlY2wp CglyZXR1cm4gTlVMTF9UUkVFOwogICAgICBpZiAoVFJFRV9DT0RFIChkZWNs KSA9PSBJREVOVElGSUVSX05PREUpCgl7CgkgICB3YXJuaW5nIChPUFRfV2F0 dHJpYnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQgb24gdHlwZXMiLAoJ CSAgICBuYW1lKTsKCSAgIHJldHVybiBOVUxMX1RSRUU7Cgl9CiAgICB9Cgog IGlmIChzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKGlkKSwgImRlZmF1 bHQiKSA9PSAwKQogICAgdmlzID0gVklTSUJJTElUWV9ERUZBVUxUOwogIGVs c2UgaWYgKHN0cmNtcCAoVFJFRV9TVFJJTkdfUE9JTlRFUiAoaWQpLCAiaW50 ZXJuYWwiKSA9PSAwKQogICAgdmlzID0gVklTSUJJTElUWV9JTlRFUk5BTDsK ICBlbHNlIGlmIChzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKGlkKSwg ImhpZGRlbiIpID09IDApCiAgICB2aXMgPSBWSVNJQklMSVRZX0hJRERFTjsK ICBlbHNlIGlmIChzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKGlkKSwg InByb3RlY3RlZCIpID09IDApCiAgICB2aXMgPSBWSVNJQklMSVRZX1BST1RF Q1RFRDsKICBlbHNlCiAgICB7CiAgICAgIGVycm9yICgidmlzaWJpbGl0eSBh cmd1bWVudCBtdXN0IGJlIG9uZSBvZiBcImRlZmF1bHRcIiwgXCJoaWRkZW5c IiwgXCJwcm90ZWN0ZWRcIiBvciBcImludGVybmFsXCIiKTsKICAgICAgdmlz ID0gVklTSUJJTElUWV9ERUZBVUxUOwogICAgfQoKICBpZiAoREVDTF9WSVNJ QklMSVRZX1NQRUNJRklFRCAoZGVjbCkKICAgICAgJiYgdmlzICE9IERFQ0xf VklTSUJJTElUWSAoZGVjbCkpCiAgICB7CiAgICAgIHRyZWUgYXR0cmlidXRl cyA9IChUWVBFX1AgKCpub2RlKQoJCQkgPyBUWVBFX0FUVFJJQlVURVMgKCpu b2RlKQoJCQkgOiBERUNMX0FUVFJJQlVURVMgKGRlY2wpKTsKICAgICAgaWYg KGxvb2t1cF9hdHRyaWJ1dGUgKCJ2aXNpYmlsaXR5IiwgYXR0cmlidXRlcykp CgllcnJvciAoIiVxRCByZWRlY2xhcmVkIHdpdGggZGlmZmVyZW50IHZpc2li aWxpdHkiLCBkZWNsKTsKICAgICAgZWxzZSBpZiAoVEFSR0VUX0RMTElNUE9S VF9ERUNMX0FUVFJJQlVURVMKCSAgICAgICAmJiBsb29rdXBfYXR0cmlidXRl ICgiZGxsaW1wb3J0IiwgYXR0cmlidXRlcykpCgllcnJvciAoIiVxRCB3YXMg ZGVjbGFyZWQgJXFzIHdoaWNoIGltcGxpZXMgZGVmYXVsdCB2aXNpYmlsaXR5 IiwKCSAgICAgICBkZWNsLCAiZGxsaW1wb3J0Iik7CiAgICAgIGVsc2UgaWYg KFRBUkdFVF9ETExJTVBPUlRfREVDTF9BVFRSSUJVVEVTCgkgICAgICAgJiYg bG9va3VwX2F0dHJpYnV0ZSAoImRsbGV4cG9ydCIsIGF0dHJpYnV0ZXMpKQoJ ZXJyb3IgKCIlcUQgd2FzIGRlY2xhcmVkICVxcyB3aGljaCBpbXBsaWVzIGRl ZmF1bHQgdmlzaWJpbGl0eSIsCgkgICAgICAgZGVjbCwgImRsbGV4cG9ydCIp OwogICAgfQoKICBERUNMX1ZJU0lCSUxJVFkgKGRlY2wpID0gdmlzOwogIERF Q0xfVklTSUJJTElUWV9TUEVDSUZJRUQgKGRlY2wpID0gMTsKCiAgLyogR28g YWhlYWQgYW5kIGF0dGFjaCB0aGUgYXR0cmlidXRlIHRvIHRoZSBub2RlIGFz IHdlbGwuICBUaGlzIGlzIG5lZWRlZAogICAgIHNvIHdlIGNhbiBkZXRlcm1p bmUgd2hldGhlciB3ZSBoYXZlIFZJU0lCSUxJVFlfREVGQVVMVCBiZWNhdXNl IHRoZQogICAgIHZpc2liaWxpdHkgd2FzIG5vdCBzcGVjaWZpZWQsIG9yIGJl Y2F1c2UgaXQgd2FzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbgogICAgIGZyb20g dGhlIGNvbnRhaW5pbmcgc2NvcGUuICAqLwoKICByZXR1cm4gTlVMTF9UUkVF Owp9CgovKiBEZXRlcm1pbmUgdGhlIEVMRiBzeW1ib2wgdmlzaWJpbGl0eSBm b3IgREVDTCwgd2hpY2ggaXMgZWl0aGVyIGEKICAgdmFyaWFibGUgb3IgYSBm dW5jdGlvbi4gIEl0IGlzIGFuIGVycm9yIHRvIHVzZSB0aGlzIGZ1bmN0aW9u IGlmIGEKICAgZGVmaW5pdGlvbiBvZiBERUNMIGlzIG5vdCBhdmFpbGFibGUg aW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgogICBSZXR1cm5zIHRydWUgaWYg dGhlIGZpbmFsIHZpc2liaWxpdHkgaGFzIGJlZW4gZGV0ZXJtaW5lZCBieSB0 aGlzCiAgIGZ1bmN0aW9uOyBmYWxzZSBpZiB0aGUgY2FsbGVyIGlzIGZyZWUg dG8gbWFrZSBhZGRpdGlvbmFsCiAgIG1vZGlmaWNhdGlvbnMuICAqLwoKYm9v bApjX2RldGVybWluZV92aXNpYmlsaXR5ICh0cmVlIGRlY2wpCnsKICBnY2Nf YXNzZXJ0IChUUkVFX0NPREUgKGRlY2wpID09IFZBUl9ERUNMCgkgICAgICB8 fCBUUkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9OX0RFQ0wpOwoKICAvKiBJ ZiB0aGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB0aGUgdmlzaWJpbGl0 eSB3aXRoIGFuCiAgICAgYXR0cmlidXRlLCBob25vciB0aGF0LiAgREVDTF9W SVNJQklMSVRZIHdpbGwgaGF2ZSBiZWVuIHNldCBkdXJpbmcKICAgICB0aGUg cHJvY2Vzc2luZyBvZiB0aGUgYXR0cmlidXRlLiAgV2UgY2hlY2sgZm9yIGFu IGV4cGxpY2l0CiAgICAgYXR0cmlidXRlLCByYXRoZXIgdGhhbiBqdXN0IGNo ZWNraW5nIERFQ0xfVklTSUJJTElUWV9TUEVDSUZJRUQsCiAgICAgdG8gZGlz dGluZ3Vpc2ggdGhlIHVzZSBvZiBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgdXNl IG9mIGEgIiNwcmFnbWEKICAgICBHQ0MgdmlzaWJpbGl0eSBwdXNoKC4uLiki OyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2Ugc3RpbGwgd2FudCBvdGhlcgogICAg IGNvbnNpZGVyYXRpb25zIHRvIGJlIGFibGUgdG8gb3ZlcnJ1bGUgdGhlICNw cmFnbWEuICAqLwogIGlmIChsb29rdXBfYXR0cmlidXRlICgidmlzaWJpbGl0 eSIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpCiAgICAgIHx8IChUQVJHRVRf RExMSU1QT1JUX0RFQ0xfQVRUUklCVVRFUwoJICAmJiAobG9va3VwX2F0dHJp YnV0ZSAoImRsbGltcG9ydCIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpCgkg ICAgICB8fCBsb29rdXBfYXR0cmlidXRlICgiZGxsZXhwb3J0IiwgREVDTF9B VFRSSUJVVEVTIChkZWNsKSkpKSkKICAgIHJldHVybiB0cnVlOwoKICAvKiBT ZXQgZGVmYXVsdCB2aXNpYmlsaXR5IHRvIHdoYXRldmVyIHRoZSB1c2VyIHN1 cHBsaWVkIHdpdGgKICAgICB2aXNpYmlsaXR5X3NwZWNpZmllZCBkZXBlbmRp bmcgb24gI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eS4gICovCiAgaWYgKCFERUNM X1ZJU0lCSUxJVFlfU1BFQ0lGSUVEIChkZWNsKSkKICAgIHsKICAgICAgREVD TF9WSVNJQklMSVRZIChkZWNsKSA9IGRlZmF1bHRfdmlzaWJpbGl0eTsKICAg ICAgREVDTF9WSVNJQklMSVRZX1NQRUNJRklFRCAoZGVjbCkgPSB2aXNpYmls aXR5X29wdGlvbnMuaW5wcmFnbWE7CiAgICB9CiAgcmV0dXJuIGZhbHNlOwp9 CgovKiBIYW5kbGUgYW4gInRsc19tb2RlbCIgYXR0cmlidXRlOyBhcmd1bWVu dHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAq LwoKc3RhdGljIHRyZWUKaGFuZGxlX3Rsc19tb2RlbF9hdHRyaWJ1dGUgKHRy ZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzLAoJCQkgICAgaW50IEFS R19VTlVTRUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJl ZSBpZDsKICB0cmVlIGRlY2wgPSAqbm9kZTsKICBlbnVtIHRsc19tb2RlbCBr aW5kOwoKICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCiAgaWYgKCFERUNMX1RI UkVBRF9MT0NBTF9QIChkZWNsKSkKICAgIHsKICAgICAgd2FybmluZyAoT1BU X1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFtZSk7 CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIGtpbmQgPSBERUNM X1RMU19NT0RFTCAoZGVjbCk7CiAgaWQgPSBUUkVFX1ZBTFVFIChhcmdzKTsK ICBpZiAoVFJFRV9DT0RFIChpZCkgIT0gU1RSSU5HX0NTVCkKICAgIHsKICAg ICAgZXJyb3IgKCJ0bHNfbW9kZWwgYXJndW1lbnQgbm90IGEgc3RyaW5nIik7 CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIGlmICghc3RyY21w IChUUkVFX1NUUklOR19QT0lOVEVSIChpZCksICJsb2NhbC1leGVjIikpCiAg ICBraW5kID0gVExTX01PREVMX0xPQ0FMX0VYRUM7CiAgZWxzZSBpZiAoIXN0 cmNtcCAoVFJFRV9TVFJJTkdfUE9JTlRFUiAoaWQpLCAiaW5pdGlhbC1leGVj IikpCiAgICBraW5kID0gVExTX01PREVMX0lOSVRJQUxfRVhFQzsKICBlbHNl IGlmICghc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChpZCksICJsb2Nh bC1keW5hbWljIikpCiAgICBraW5kID0gb3B0aW1pemUgPyBUTFNfTU9ERUxf TE9DQUxfRFlOQU1JQyA6IFRMU19NT0RFTF9HTE9CQUxfRFlOQU1JQzsKICBl bHNlIGlmICghc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChpZCksICJn bG9iYWwtZHluYW1pYyIpKQogICAga2luZCA9IFRMU19NT0RFTF9HTE9CQUxf RFlOQU1JQzsKICBlbHNlCiAgICBlcnJvciAoInRsc19tb2RlbCBhcmd1bWVu dCBtdXN0IGJlIG9uZSBvZiBcImxvY2FsLWV4ZWNcIiwgXCJpbml0aWFsLWV4 ZWNcIiwgXCJsb2NhbC1keW5hbWljXCIgb3IgXCJnbG9iYWwtZHluYW1pY1wi Iik7CgogIERFQ0xfVExTX01PREVMIChkZWNsKSA9IGtpbmQ7CiAgcmV0dXJu IE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm5vX2luc3RydW1lbnRfZnVu Y3Rpb24iIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBh dHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRs ZV9ub19pbnN0cnVtZW50X2Z1bmN0aW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9k ZSwgdHJlZSBuYW1lLAoJCQkJCSB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJ CQkJCSBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkJCSBib29sICpub19h ZGRfYXR0cnMpCnsKICB0cmVlIGRlY2wgPSAqbm9kZTsKCiAgaWYgKFRSRUVf Q09ERSAoZGVjbCkgIT0gRlVOQ1RJT05fREVDTCkKICAgIHsKICAgICAgZXJy b3IgKCIlSiVxRSBhdHRyaWJ1dGUgYXBwbGllcyBvbmx5IHRvIGZ1bmN0aW9u cyIsIGRlY2wsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsK ICAgIH0KICBlbHNlIGlmIChERUNMX0lOSVRJQUwgKGRlY2wpKQogICAgewog ICAgICBlcnJvciAoIiVKY2FuJSd0IHNldCAlcUUgYXR0cmlidXRlIGFmdGVy IGRlZmluaXRpb24iLCBkZWNsLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRy cyA9IHRydWU7CiAgICB9CiAgZWxzZQogICAgREVDTF9OT19JTlNUUlVNRU5U X0ZVTkNUSU9OX0VOVFJZX0VYSVQgKGRlY2wpID0gMTsKCiAgcmV0dXJuIE5V TExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm1hbGxvYyIgYXR0cmlidXRlOyBh cmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRs ZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX21hbGxvY19hdHRyaWJ1dGUg KHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBBUkdfVU5VU0VEIChhcmdz KSwKCQkJIGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9h dHRycykKewogIGlmIChUUkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9E RUNMCiAgICAgICYmIFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKFRSRUVf VFlQRSAoKm5vZGUpKSkpCiAgICBERUNMX0lTX01BTExPQyAoKm5vZGUpID0g MTsKICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgImFsbG9jX3NpemUiIGF0dHJpYnV0ZTsgYXJndW1l bnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAg Ki8KCnN0YXRpYyB0cmVlCmhhbmRsZV9hbGxvY19zaXplX2F0dHJpYnV0ZSAo dHJlZSAqbm9kZSwgdHJlZSBBUkdfVU5VU0VEIChuYW1lKSwgdHJlZSBhcmdz LAoJCQkgICAgIGludCBBUkdfVU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2Fk ZF9hdHRycykKewogIHRyZWUgcGFyYW1zID0gVFlQRV9BUkdfVFlQRVMgKCpu b2RlKTsKICB1bnNpZ25lZCBhcmdfY291bnQgPSAwOwoKICBmb3IgKDsgVFJF RV9DSEFJTiAocGFyYW1zKTsgcGFyYW1zID0gVFJFRV9DSEFJTiAocGFyYW1z KSkKICAgIGFyZ19jb3VudCArKzsKCiAgZm9yICg7IGFyZ3M7IGFyZ3MgPSBU UkVFX0NIQUlOIChhcmdzKSkKICAgIHsKICAgICAgdHJlZSBwb3NpdGlvbiA9 IFRSRUVfVkFMVUUgKGFyZ3MpOwoKICAgICAgaWYgKFRSRUVfQ09ERSAocG9z aXRpb24pICE9IElOVEVHRVJfQ1NUCgkgIHx8IFRSRUVfSU5UX0NTVF9ISUdI IChwb3NpdGlvbikgCgkgIHx8IFRSRUVfSU5UX0NTVF9MT1cgKHBvc2l0aW9u KSA8IDEKCSAgfHwgVFJFRV9JTlRfQ1NUX0xPVyAocG9zaXRpb24pID4gYXJn X2NvdW50ICkKCXsKCSAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAKCSAg ICAgICAgICAgImFsbG9jX3NpemUgcGFyYW1ldGVyIG91dHNpZGUgcmFuZ2Ui KTsKCSAgKm5vX2FkZF9hdHRycyA9IHRydWU7CgkgIHJldHVybiBOVUxMX1RS RUU7Cgl9CiAgICB9CiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxl IGEgInJldHVybnNfdHdpY2UiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGlu CiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRp YyB0cmVlCmhhbmRsZV9yZXR1cm5zX3R3aWNlX2F0dHJpYnV0ZSAodHJlZSAq bm9kZSwgdHJlZSBuYW1lLCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkg aW50IEFSR19VTlVTRUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7 CiAgaWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAg ICBERUNMX0lTX1JFVFVSTlNfVFdJQ0UgKCpub2RlKSA9IDE7CiAgZWxzZQog ICAgewogICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIlcUUgYXR0 cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgKm5vX2FkZF9hdHRycyA9 IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRs ZSBhICJub19saW1pdF9zdGFjayIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMg aW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3Rh dGljIHRyZWUKaGFuZGxlX25vX2xpbWl0X3N0YWNrX2F0dHJpYnV0ZSAodHJl ZSAqbm9kZSwgdHJlZSBuYW1lLAoJCQkJIHRyZWUgQVJHX1VOVVNFRCAoYXJn cyksCgkJCQkgaW50IEFSR19VTlVTRUQgKGZsYWdzKSwKCQkJCSBib29sICpu b19hZGRfYXR0cnMpCnsKICB0cmVlIGRlY2wgPSAqbm9kZTsKCiAgaWYgKFRS RUVfQ09ERSAoZGVjbCkgIT0gRlVOQ1RJT05fREVDTCkKICAgIHsKICAgICAg ZXJyb3IgKCIlSiVxRSBhdHRyaWJ1dGUgYXBwbGllcyBvbmx5IHRvIGZ1bmN0 aW9ucyIsIGRlY2wsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1 ZTsKICAgIH0KICBlbHNlIGlmIChERUNMX0lOSVRJQUwgKGRlY2wpKQogICAg ewogICAgICBlcnJvciAoIiVKY2FuJSd0IHNldCAlcUUgYXR0cmlidXRlIGFm dGVyIGRlZmluaXRpb24iLCBkZWNsLCBuYW1lKTsKICAgICAgKm5vX2FkZF9h dHRycyA9IHRydWU7CiAgICB9CiAgZWxzZQogICAgREVDTF9OT19MSU1JVF9T VEFDSyAoZGVjbCkgPSAxOwoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBI YW5kbGUgYSAicHVyZSIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAg c3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRy ZWUKaGFuZGxlX3B1cmVfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5h bWUsIHRyZWUgQVJHX1VOVVNFRCAoYXJncyksCgkJICAgICAgIGludCBBUkdf VU5VU0VEIChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykKewogIGlmIChU UkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKQogICAgREVDTF9J U19QVVJFICgqbm9kZSkgPSAxOwogIC8qID8/PyBUT0RPOiBTdXBwb3J0IHR5 cGVzLiAgKi8KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0 cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAg ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExf VFJFRTsKfQoKLyogSGFuZGxlIGEgIm5vIHZvcHMiIGF0dHJpYnV0ZTsgYXJn dW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVy LiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9ub3ZvcHNfYXR0cmlidXRlICh0 cmVlICpub2RlLCB0cmVlIEFSR19VTlVTRUQgKG5hbWUpLAoJCQkgdHJlZSBB UkdfVU5VU0VEIChhcmdzKSwgaW50IEFSR19VTlVTRUQgKGZsYWdzKSwKCQkJ IGJvb2wgKkFSR19VTlVTRUQgKG5vX2FkZF9hdHRycykpCnsKICBnY2NfYXNz ZXJ0IChUUkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKTsKICBE RUNMX0lTX05PVk9QUyAoKm5vZGUpID0gMTsKICByZXR1cm4gTlVMTF9UUkVF Owp9CgovKiBIYW5kbGUgYSAiZGVwcmVjYXRlZCIgYXR0cmlidXRlOyBhcmd1 bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIu ICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX2RlcHJlY2F0ZWRfYXR0cmlidXRl ICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJCSAgICAgdHJlZSBBUkdfVU5V U0VEIChhcmdzKSwgaW50IGZsYWdzLAoJCQkgICAgIGJvb2wgKm5vX2FkZF9h dHRycykKewogIHRyZWUgdHlwZSA9IE5VTExfVFJFRTsKICBpbnQgd2FybiA9 IDA7CiAgdHJlZSB3aGF0ID0gTlVMTF9UUkVFOwoKICBpZiAoREVDTF9QICgq bm9kZSkpCiAgICB7CiAgICAgIHRyZWUgZGVjbCA9ICpub2RlOwogICAgICB0 eXBlID0gVFJFRV9UWVBFIChkZWNsKTsKCiAgICAgIGlmIChUUkVFX0NPREUg KGRlY2wpID09IFRZUEVfREVDTAoJICB8fCBUUkVFX0NPREUgKGRlY2wpID09 IFBBUk1fREVDTAoJICB8fCBUUkVFX0NPREUgKGRlY2wpID09IFZBUl9ERUNM CgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTAoJICB8 fCBUUkVFX0NPREUgKGRlY2wpID09IEZJRUxEX0RFQ0wpCglUUkVFX0RFUFJF Q0FURUQgKGRlY2wpID0gMTsKICAgICAgZWxzZQoJd2FybiA9IDE7CiAgICB9 CiAgZWxzZSBpZiAoVFlQRV9QICgqbm9kZSkpCiAgICB7CiAgICAgIGlmICgh KGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZUEVfSU5fUExBQ0UpKQoJKm5v ZGUgPSBidWlsZF92YXJpYW50X3R5cGVfY29weSAoKm5vZGUpOwogICAgICBU UkVFX0RFUFJFQ0FURUQgKCpub2RlKSA9IDE7CiAgICAgIHR5cGUgPSAqbm9k ZTsKICAgIH0KICBlbHNlCiAgICB3YXJuID0gMTsKCiAgaWYgKHdhcm4pCiAg ICB7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgICBpZiAodHlw ZSAmJiBUWVBFX05BTUUgKHR5cGUpKQoJewoJICBpZiAoVFJFRV9DT0RFIChU WVBFX05BTUUgKHR5cGUpKSA9PSBJREVOVElGSUVSX05PREUpCgkgICAgd2hh dCA9IFRZUEVfTkFNRSAoKm5vZGUpOwoJICBlbHNlIGlmIChUUkVFX0NPREUg KFRZUEVfTkFNRSAodHlwZSkpID09IFRZUEVfREVDTAoJCSAgICYmIERFQ0xf TkFNRSAoVFlQRV9OQU1FICh0eXBlKSkpCgkgICAgd2hhdCA9IERFQ0xfTkFN RSAoVFlQRV9OQU1FICh0eXBlKSk7Cgl9CiAgICAgIGlmICh3aGF0KQoJd2Fy bmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVk IGZvciAlcUUiLCBuYW1lLCB3aGF0KTsKICAgICAgZWxzZQoJd2FybmluZyAo T1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVkIiwgbmFt ZSk7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBh ICJ2ZWN0b3Jfc2l6ZSIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAg c3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRy ZWUKaGFuZGxlX3ZlY3Rvcl9zaXplX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwg dHJlZSBuYW1lLCB0cmVlIGFyZ3MsCgkJCSAgICAgIGludCBBUkdfVU5VU0VE IChmbGFncyksCgkJCSAgICAgIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHVu c2lnbmVkIEhPU1RfV0lERV9JTlQgdmVjc2l6ZSwgbnVuaXRzOwogIGVudW0g bWFjaGluZV9tb2RlIG9yaWdfbW9kZTsKICB0cmVlIHR5cGUgPSAqbm9kZSwg bmV3X3R5cGUsIHNpemU7CgogICpub19hZGRfYXR0cnMgPSB0cnVlOwoKICBz aXplID0gVFJFRV9WQUxVRSAoYXJncyk7CgogIGlmICghaG9zdF9pbnRlZ2Vy cCAoc2l6ZSwgMSkpCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmli dXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICBy ZXR1cm4gTlVMTF9UUkVFOwogICAgfQoKICAvKiBHZXQgdGhlIHZlY3RvciBz aXplIChpbiBieXRlcykuICAqLwogIHZlY3NpemUgPSB0cmVlX2xvd19jc3Qg KHNpemUsIDEpOwoKICAvKiBXZSBuZWVkIHRvIHByb3ZpZGUgZm9yIHZlY3Rv ciBwb2ludGVycywgdmVjdG9yIGFycmF5cywgYW5kCiAgICAgZnVuY3Rpb25z IHJldHVybmluZyB2ZWN0b3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgX19h dHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2hvcnQgKmZvbzsKCiAg ICAgSW4gdGhpcyBjYXNlLCB0aGUgbW9kZSBpcyBTSSwgYnV0IHRoZSB0eXBl IGJlaW5nIG1vZGlmaWVkIGlzCiAgICAgSEksIHNvIHdlIG5lZWQgdG8gbG9v ayBmdXJ0aGVyLiAgKi8KCiAgd2hpbGUgKFBPSU5URVJfVFlQRV9QICh0eXBl KQoJIHx8IFRSRUVfQ09ERSAodHlwZSkgPT0gRlVOQ1RJT05fVFlQRQoJIHx8 IFRSRUVfQ09ERSAodHlwZSkgPT0gTUVUSE9EX1RZUEUKCSB8fCBUUkVFX0NP REUgKHR5cGUpID09IEFSUkFZX1RZUEUpCiAgICB0eXBlID0gVFJFRV9UWVBF ICh0eXBlKTsKCiAgLyogR2V0IHRoZSBtb2RlIG9mIHRoZSB0eXBlIGJlaW5n IG1vZGlmaWVkLiAgKi8KICBvcmlnX21vZGUgPSBUWVBFX01PREUgKHR5cGUp OwoKICBpZiAoVFJFRV9DT0RFICh0eXBlKSA9PSBSRUNPUkRfVFlQRQogICAg ICB8fCBUUkVFX0NPREUgKHR5cGUpID09IFVOSU9OX1RZUEUKICAgICAgfHwg VFJFRV9DT0RFICh0eXBlKSA9PSBWRUNUT1JfVFlQRQogICAgICB8fCAoIVND QUxBUl9GTE9BVF9NT0RFX1AgKG9yaWdfbW9kZSkKCSAgJiYgR0VUX01PREVf Q0xBU1MgKG9yaWdfbW9kZSkgIT0gTU9ERV9JTlQKCSAgJiYgIUFMTF9TQ0FM QVJfRklYRURfUE9JTlRfTU9ERV9QIChvcmlnX21vZGUpKQogICAgICB8fCAh aG9zdF9pbnRlZ2VycCAoVFlQRV9TSVpFX1VOSVQgKHR5cGUpLCAxKSkKICAg IHsKICAgICAgZXJyb3IgKCJpbnZhbGlkIHZlY3RvciB0eXBlIGZvciBhdHRy aWJ1dGUgJXFFIiwgbmFtZSk7CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAg ICB9CgogIGlmICh2ZWNzaXplICUgdHJlZV9sb3dfY3N0IChUWVBFX1NJWkVf VU5JVCAodHlwZSksIDEpKQogICAgewogICAgICBlcnJvciAoInZlY3RvciBz aXplIG5vdCBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiBjb21wb25lbnQgc2l6 ZSIpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgaWYgKHZlY3NpemUg PT0gMCkKICAgIHsKICAgICAgZXJyb3IgKCJ6ZXJvIHZlY3RvciBzaXplIik7 CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAvKiBDYWxjdWxhdGUgaG93 IG1hbnkgdW5pdHMgZml0IGluIHRoZSB2ZWN0b3IuICAqLwogIG51bml0cyA9 IHZlY3NpemUgLyB0cmVlX2xvd19jc3QgKFRZUEVfU0laRV9VTklUICh0eXBl KSwgMSk7CiAgaWYgKG51bml0cyAmIChudW5pdHMgLSAxKSkKICAgIHsKICAg ICAgZXJyb3IgKCJudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgdmVjdG9y IG5vdCBhIHBvd2VyIG9mIHR3byIpOwogICAgICByZXR1cm4gTlVMTF9UUkVF OwogICAgfQoKICBuZXdfdHlwZSA9IGJ1aWxkX3ZlY3Rvcl90eXBlICh0eXBl LCBudW5pdHMpOwoKICAvKiBCdWlsZCBiYWNrIHBvaW50ZXJzIGlmIG5lZWRl ZC4gICovCiAgKm5vZGUgPSByZWNvbnN0cnVjdF9jb21wbGV4X3R5cGUgKCpu b2RlLCBuZXdfdHlwZSk7CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhh bmRsZSB0aGUgIm5vbm51bGwiIGF0dHJpYnV0ZS4gICovCnN0YXRpYyB0cmVl CmhhbmRsZV9ub25udWxsX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBB UkdfVU5VU0VEIChuYW1lKSwKCQkJICB0cmVlIGFyZ3MsIGludCBBUkdfVU5V U0VEIChmbGFncyksCgkJCSAgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJl ZSB0eXBlID0gKm5vZGU7CiAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBhdHRy X2FyZ19udW07CgogIC8qIElmIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVk LCBhbGwgcG9pbnRlciBhcmd1bWVudHMgc2hvdWxkIGJlCiAgICAgbm9uLW51 bGwuICBWZXJpZnkgYSBmdWxsIHByb3RvdHlwZSBpcyBnaXZlbiBzbyB0aGF0 IHRoZSBhcmd1bWVudHMKICAgICB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgdHlw ZXMgd2hlbiB3ZSBhY3R1YWxseSBjaGVjayB0aGVtIGxhdGVyLiAgKi8KICBp ZiAoIWFyZ3MpCiAgICB7CiAgICAgIGlmICghVFlQRV9BUkdfVFlQRVMgKHR5 cGUpKQoJewoJICBlcnJvciAoIm5vbm51bGwgYXR0cmlidXRlIHdpdGhvdXQg YXJndW1lbnRzIG9uIGEgbm9uLXByb3RvdHlwZSIpOwoJICAqbm9fYWRkX2F0 dHJzID0gdHJ1ZTsKCX0KICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0K CiAgLyogQXJndW1lbnQgbGlzdCBzcGVjaWZpZWQuICBWZXJpZnkgdGhhdCBl YWNoIGFyZ3VtZW50IG51bWJlciByZWZlcmVuY2VzCiAgICAgYSBwb2ludGVy IGFyZ3VtZW50LiAgKi8KICBmb3IgKGF0dHJfYXJnX251bSA9IDE7IGFyZ3M7 IGFyZ3MgPSBUUkVFX0NIQUlOIChhcmdzKSkKICAgIHsKICAgICAgdHJlZSBh cmd1bWVudDsKICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBhcmdfbnVt ID0gMCwgY2tfbnVtOwoKICAgICAgaWYgKCFnZXRfbm9ubnVsbF9vcGVyYW5k IChUUkVFX1ZBTFVFIChhcmdzKSwgJmFyZ19udW0pKQoJewoJICBlcnJvciAo Im5vbm51bGwgYXJndW1lbnQgaGFzIGludmFsaWQgb3BlcmFuZCBudW1iZXIg KGFyZ3VtZW50ICVsdSkiLAoJCSAodW5zaWduZWQgbG9uZykgYXR0cl9hcmdf bnVtKTsKCSAgKm5vX2FkZF9hdHRycyA9IHRydWU7CgkgIHJldHVybiBOVUxM X1RSRUU7Cgl9CgogICAgICBhcmd1bWVudCA9IFRZUEVfQVJHX1RZUEVTICh0 eXBlKTsKICAgICAgaWYgKGFyZ3VtZW50KQoJewoJICBmb3IgKGNrX251bSA9 IDE7IDsgY2tfbnVtKyspCgkgICAgewoJICAgICAgaWYgKCFhcmd1bWVudCB8 fCBja19udW0gPT0gYXJnX251bSkKCQlicmVhazsKCSAgICAgIGFyZ3VtZW50 ID0gVFJFRV9DSEFJTiAoYXJndW1lbnQpOwoJICAgIH0KCgkgIGlmICghYXJn dW1lbnQKCSAgICAgIHx8IFRSRUVfQ09ERSAoVFJFRV9WQUxVRSAoYXJndW1l bnQpKSA9PSBWT0lEX1RZUEUpCgkgICAgewoJICAgICAgZXJyb3IgKCJub25u dWxsIGFyZ3VtZW50IHdpdGggb3V0LW9mLXJhbmdlIG9wZXJhbmQgbnVtYmVy IChhcmd1bWVudCAlbHUsIG9wZXJhbmQgJWx1KSIsCgkJICAgICAodW5zaWdu ZWQgbG9uZykgYXR0cl9hcmdfbnVtLCAodW5zaWduZWQgbG9uZykgYXJnX251 bSk7CgkgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAgICAgIHJldHVy biBOVUxMX1RSRUU7CgkgICAgfQoKCSAgaWYgKFRSRUVfQ09ERSAoVFJFRV9W QUxVRSAoYXJndW1lbnQpKSAhPSBQT0lOVEVSX1RZUEUpCgkgICAgewoJICAg ICAgZXJyb3IgKCJub25udWxsIGFyZ3VtZW50IHJlZmVyZW5jZXMgbm9uLXBv aW50ZXIgb3BlcmFuZCAoYXJndW1lbnQgJWx1LCBvcGVyYW5kICVsdSkiLAoJ CSAgICh1bnNpZ25lZCBsb25nKSBhdHRyX2FyZ19udW0sICh1bnNpZ25lZCBs b25nKSBhcmdfbnVtKTsKCSAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwoJ ICAgICAgcmV0dXJuIE5VTExfVFJFRTsKCSAgICB9Cgl9CiAgICB9CgogIHJl dHVybiBOVUxMX1RSRUU7Cn0KCi8qIENoZWNrIHRoZSBhcmd1bWVudCBsaXN0 IG9mIGEgZnVuY3Rpb24gY2FsbCBmb3IgbnVsbCBpbiBhcmd1bWVudCBzbG90 cwogICB0aGF0IGFyZSBtYXJrZWQgYXMgcmVxdWlyaW5nIGEgbm9uLW51bGwg cG9pbnRlciBhcmd1bWVudC4gIFRoZSBOQVJHUwogICBhcmd1bWVudHMgYXJl IHBhc3NlZCBpbiB0aGUgYXJyYXkgQVJHQVJSQVkuCiovCgpzdGF0aWMgdm9p ZApjaGVja19mdW5jdGlvbl9ub25udWxsICh0cmVlIGF0dHJzLCBpbnQgbmFy Z3MsIHRyZWUgKmFyZ2FycmF5KQp7CiAgdHJlZSBhLCBhcmdzOwogIGludCBp OwoKICBmb3IgKGEgPSBhdHRyczsgYTsgYSA9IFRSRUVfQ0hBSU4gKGEpKQog ICAgewogICAgICBpZiAoaXNfYXR0cmlidXRlX3AgKCJub25udWxsIiwgVFJF RV9QVVJQT1NFIChhKSkpCgl7CgkgIGFyZ3MgPSBUUkVFX1ZBTFVFIChhKTsK CgkgIC8qIFdhbGsgdGhlIGFyZ3VtZW50IGxpc3QuICBJZiB3ZSBlbmNvdW50 ZXIgYW4gYXJndW1lbnQgbnVtYmVyIHdlCgkgICAgIHNob3VsZCBjaGVjayBm b3Igbm9uLW51bGwsIGRvIGl0LiAgSWYgdGhlIGF0dHJpYnV0ZSBoYXMgbm8g YXJncywKCSAgICAgdGhlbiBldmVyeSBwb2ludGVyIGFyZ3VtZW50IGlzIGNo ZWNrZWQgKGluIHdoaWNoIGNhc2UgdGhlIGNoZWNrCgkgICAgIGZvciBwb2lu dGVyIHR5cGUgaXMgZG9uZSBpbiBjaGVja19ub25udWxsX2FyZykuICAqLwoJ ICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKCSAgICB7CgkgICAgICBp ZiAoIWFyZ3MgfHwgbm9ubnVsbF9jaGVja19wIChhcmdzLCBpICsgMSkpCgkJ Y2hlY2tfZnVuY3Rpb25fYXJndW1lbnRzX3JlY3Vyc2UgKGNoZWNrX25vbm51 bGxfYXJnLCBOVUxMLAoJCQkJCQkgIGFyZ2FycmF5W2ldLAoJCQkJCQkgIGkg KyAxKTsKCSAgICB9Cgl9CiAgICB9Cn0KCi8qIENoZWNrIHRoYXQgdGhlIE50 aCBhcmd1bWVudCBvZiBhIGZ1bmN0aW9uIGNhbGwgKGNvdW50aW5nIGJhY2t3 YXJkcwogICBmcm9tIHRoZSBlbmQpIGlzIGEgKHBvaW50ZXIpMC4gIFRoZSBO QVJHUyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiB0aGUKICAgYXJyYXkgQVJH QVJSQVkuICAqLwoKc3RhdGljIHZvaWQKY2hlY2tfZnVuY3Rpb25fc2VudGlu ZWwgKHRyZWUgYXR0cnMsIGludCBuYXJncywgdHJlZSAqYXJnYXJyYXksIHRy ZWUgdHlwZWxpc3QpCnsKICB0cmVlIGF0dHIgPSBsb29rdXBfYXR0cmlidXRl ICgic2VudGluZWwiLCBhdHRycyk7CgogIGlmIChhdHRyKQogICAgewogICAg ICBpbnQgbGVuID0gMDsKICAgICAgaW50IHBvcyA9IDA7CiAgICAgIHRyZWUg c2VudGluZWw7CgogICAgICAvKiBTa2lwIG92ZXIgdGhlIG5hbWVkIGFyZ3Vt ZW50cy4gICovCiAgICAgIHdoaWxlICh0eXBlbGlzdCAmJiBsZW4gPCBuYXJn cykKCXsKCSAgdHlwZWxpc3QgPSBUUkVFX0NIQUlOICh0eXBlbGlzdCk7Cgkg IGxlbisrOwoJfQoKICAgICAgaWYgKFRSRUVfVkFMVUUgKGF0dHIpKQoJewoJ ICB0cmVlIHAgPSBUUkVFX1ZBTFVFIChUUkVFX1ZBTFVFIChhdHRyKSk7Cgkg IHBvcyA9IFRSRUVfSU5UX0NTVF9MT1cgKHApOwoJfQoKICAgICAgLyogVGhl IHNlbnRpbmVsIG11c3QgYmUgb25lIG9mIHRoZSB2YXJhcmdzLCBpLmUuCgkg aW4gcG9zaXRpb24gPj0gdGhlIG51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMu ICAqLwogICAgICBpZiAoKG5hcmdzIC0gMSAtIHBvcykgPCBsZW4pCgl7Cgkg IHdhcm5pbmcgKE9QVF9XZm9ybWF0LAoJCSAgICJub3QgZW5vdWdoIHZhcmlh YmxlIGFyZ3VtZW50cyB0byBmaXQgYSBzZW50aW5lbCIpOwoJICByZXR1cm47 Cgl9CgogICAgICAvKiBWYWxpZGF0ZSB0aGUgc2VudGluZWwuICAqLwogICAg ICBzZW50aW5lbCA9IGFyZ2FycmF5W25hcmdzIC0gMSAtIHBvc107CiAgICAg IGlmICgoIVBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKHNlbnRpbmVsKSkK CSAgIHx8ICFpbnRlZ2VyX3plcm9wIChzZW50aW5lbCkpCgkgIC8qIEFsdGhv dWdoIF9fbnVsbCAoaW4gQysrKSBpcyBvbmx5IGFuIGludGVnZXIgd2UgYWxs b3cgaXQKCSAgICAgbmV2ZXJ0aGVsZXNzLCBhcyB3ZSBhcmUgZ3VhcmFudGVl ZCB0aGF0IGl0J3MgZXhhY3RseQoJICAgICBhcyB3aWRlIGFzIGEgcG9pbnRl ciwgYW5kIHdlIGRvbid0IHdhbnQgdG8gZm9yY2UKCSAgICAgdXNlcnMgdG8g Y2FzdCB0aGUgTlVMTCB0aGV5IGhhdmUgd3JpdHRlbiB0aGVyZS4KCSAgICAg V2Ugd2FybiB3aXRoIC1Xc3RyaWN0LW51bGwtc2VudGluZWwsIHRob3VnaC4g ICovCgkgICYmICh3YXJuX3N0cmljdF9udWxsX3NlbnRpbmVsIHx8IG51bGxf bm9kZSAhPSBzZW50aW5lbCkpCgl3YXJuaW5nIChPUFRfV2Zvcm1hdCwgIm1p c3Npbmcgc2VudGluZWwgaW4gZnVuY3Rpb24gY2FsbCIpOwogICAgfQp9Cgov KiBIZWxwZXIgZm9yIGNoZWNrX2Z1bmN0aW9uX25vbm51bGw7IGdpdmVuIGEg bGlzdCBvZiBvcGVyYW5kcyB3aGljaAogICBtdXN0IGJlIG5vbi1udWxsIGlu IEFSR1MsIGRldGVybWluZSBpZiBvcGVyYW5kIFBBUkFNX05VTSBzaG91bGQg YmUKICAgY2hlY2tlZC4gICovCgpzdGF0aWMgYm9vbApub25udWxsX2NoZWNr X3AgKHRyZWUgYXJncywgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBwYXJhbV9u dW0pCnsKICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGFyZ19udW0gPSAwOwoK ICBmb3IgKDsgYXJnczsgYXJncyA9IFRSRUVfQ0hBSU4gKGFyZ3MpKQogICAg ewogICAgICBib29sIGZvdW5kID0gZ2V0X25vbm51bGxfb3BlcmFuZCAoVFJF RV9WQUxVRSAoYXJncyksICZhcmdfbnVtKTsKCiAgICAgIGdjY19hc3NlcnQg KGZvdW5kKTsKCiAgICAgIGlmIChhcmdfbnVtID09IHBhcmFtX251bSkKCXJl dHVybiB0cnVlOwogICAgfQogIHJldHVybiBmYWxzZTsKfQoKLyogQ2hlY2sg dGhhdCB0aGUgZnVuY3Rpb24gYXJndW1lbnQgUEFSQU0gKHdoaWNoIGlzIG9w ZXJhbmQgbnVtYmVyCiAgIFBBUkFNX05VTSkgaXMgbm9uLW51bGwuICBUaGlz IGlzIGNhbGxlZCBieSBjaGVja19mdW5jdGlvbl9ub25udWxsCiAgIHZpYSBj aGVja19mdW5jdGlvbl9hcmd1bWVudHNfcmVjdXJzZS4gICovCgpzdGF0aWMg dm9pZApjaGVja19ub25udWxsX2FyZyAodm9pZCAqIEFSR19VTlVTRUQgKGN0 eCksIHRyZWUgcGFyYW0sCgkJICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBw YXJhbV9udW0pCnsKICAvKiBKdXN0IHNraXAgY2hlY2tpbmcgdGhlIGFyZ3Vt ZW50IGlmIGl0J3Mgbm90IGEgcG9pbnRlci4gIFRoaXMgY2FuCiAgICAgaGFw cGVuIGlmIHRoZSAibm9ubnVsbCIgYXR0cmlidXRlIHdhcyBnaXZlbiB3aXRo b3V0IGFuIG9wZXJhbmQKICAgICBsaXN0ICh3aGljaCBtZWFucyB0byBjaGVj ayBldmVyeSBwb2ludGVyIGFyZ3VtZW50KS4gICovCgogIGlmIChUUkVFX0NP REUgKFRSRUVfVFlQRSAocGFyYW0pKSAhPSBQT0lOVEVSX1RZUEUpCiAgICBy ZXR1cm47CgogIGlmIChpbnRlZ2VyX3plcm9wIChwYXJhbSkpCiAgICB3YXJu aW5nIChPUFRfV25vbm51bGwsICJudWxsIGFyZ3VtZW50IHdoZXJlIG5vbi1u dWxsIHJlcXVpcmVkICIKCSAgICAgIihhcmd1bWVudCAlbHUpIiwgKHVuc2ln bmVkIGxvbmcpIHBhcmFtX251bSk7Cn0KCi8qIEhlbHBlciBmb3Igbm9ubnVs bCBhdHRyaWJ1dGUgaGFuZGxpbmc7IGZldGNoIHRoZSBvcGVyYW5kIG51bWJl cgogICBmcm9tIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnQgbGlzdC4gICovCgpz dGF0aWMgYm9vbApnZXRfbm9ubnVsbF9vcGVyYW5kICh0cmVlIGFyZ19udW1f ZXhwciwgdW5zaWduZWQgSE9TVF9XSURFX0lOVCAqdmFscCkKewogIC8qIFZl cmlmeSB0aGUgYXJnIG51bWJlciBpcyBhIGNvbnN0YW50LiAgKi8KICBpZiAo VFJFRV9DT0RFIChhcmdfbnVtX2V4cHIpICE9IElOVEVHRVJfQ1NUCiAgICAg IHx8IFRSRUVfSU5UX0NTVF9ISUdIIChhcmdfbnVtX2V4cHIpICE9IDApCiAg ICByZXR1cm4gZmFsc2U7CgogICp2YWxwID0gVFJFRV9JTlRfQ1NUX0xPVyAo YXJnX251bV9leHByKTsKICByZXR1cm4gdHJ1ZTsKfQoKLyogSGFuZGxlIGEg Im5vdGhyb3ciIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVj dCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhh bmRsZV9ub3Rocm93X2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1l LCB0cmVlIEFSR19VTlVTRUQgKGFyZ3MpLAoJCQkgIGludCBBUkdfVU5VU0VE IChmbGFncyksIGJvb2wgKm5vX2FkZF9hdHRycykKewogIGlmIChUUkVFX0NP REUgKCpub2RlKSA9PSBGVU5DVElPTl9ERUNMKQogICAgVFJFRV9OT1RIUk9X ICgqbm9kZSkgPSAxOwogIC8qID8/PyBUT0RPOiBTdXBwb3J0IHR5cGVzLiAg Ki8KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRl cywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsK fQoKLyogSGFuZGxlIGEgImNsZWFudXAiIGF0dHJpYnV0ZTsgYXJndW1lbnRz IGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8K CnN0YXRpYyB0cmVlCmhhbmRsZV9jbGVhbnVwX2F0dHJpYnV0ZSAodHJlZSAq bm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MsCgkJCSAgaW50IEFSR19VTlVT RUQgKGZsYWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNs ID0gKm5vZGU7CiAgdHJlZSBjbGVhbnVwX2lkLCBjbGVhbnVwX2RlY2w7Cgog IC8qID8/PyBDb3VsZCBwZXJoYXBzIHN1cHBvcnQgY2xlYW51cHMgb24gVFJF RV9TVEFUSUMsIG11Y2ggbGlrZSB3ZSBkbwogICAgIGZvciBnbG9iYWwgZGVz dHJ1Y3RvcnMgaW4gQysrLiAgVGhpcyByZXF1aXJlcyBpbmZyYXN0cnVjdHVy ZSB0aGF0CiAgICAgd2UgZG9uJ3QgaGF2ZSBnZW5lcmljYWxseSBhdCB0aGUg bW9tZW50LiAgSXQncyBhbHNvIG5vdCBhIGZlYXR1cmUKICAgICB3ZSdkIGJl IG1pc3NpbmcgdG9vIG11Y2gsIHNpbmNlIHdlIGRvIGhhdmUgYXR0cmlidXRl IGNvbnN0cnVjdG9yLiAgKi8KICBpZiAoVFJFRV9DT0RFIChkZWNsKSAhPSBW QVJfREVDTCB8fCBUUkVFX1NUQVRJQyAoZGVjbCkpCiAgICB7CiAgICAgIHdh cm5pbmcgKE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3Jl ZCIsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgICAg cmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiAgLyogVmVyaWZ5IHRoYXQgdGhl IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gaW4gc2NvcGUuICAqLwogIC8qID8/ PyBXZSBjb3VsZCBzdXBwb3J0IHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBoZXJl IGFzIHdlbGwsIGlmCiAgICAgdGhhdCB3YXMgY29uc2lkZXJlZCBkZXNpcmFi bGUuICAqLwogIGNsZWFudXBfaWQgPSBUUkVFX1ZBTFVFIChhcmdzKTsKICBp ZiAoVFJFRV9DT0RFIChjbGVhbnVwX2lkKSAhPSBJREVOVElGSUVSX05PREUp CiAgICB7CiAgICAgIGVycm9yICgiY2xlYW51cCBhcmd1bWVudCBub3QgYW4g aWRlbnRpZmllciIpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAg ICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KICBjbGVhbnVwX2RlY2wgPSBs b29rdXBfbmFtZSAoY2xlYW51cF9pZCk7CiAgaWYgKCFjbGVhbnVwX2RlY2wg fHwgVFJFRV9DT0RFIChjbGVhbnVwX2RlY2wpICE9IEZVTkNUSU9OX0RFQ0wp CiAgICB7CiAgICAgIGVycm9yICgiY2xlYW51cCBhcmd1bWVudCBub3QgYSBm dW5jdGlvbiIpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgICAg cmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiAgLyogVGhhdCB0aGUgZnVuY3Rp b24gaGFzIHByb3BlciB0eXBlIGlzIGNoZWNrZWQgd2l0aCB0aGUKICAgICBl dmVudHVhbCBjYWxsIHRvIGJ1aWxkX2Z1bmN0aW9uX2NhbGwuICAqLwoKICBy ZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAid2Fybl91bnVzZWRf cmVzdWx0IiBhdHRyaWJ1dGUuICBObyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8K CnN0YXRpYyB0cmVlCmhhbmRsZV93YXJuX3VudXNlZF9yZXN1bHRfYXR0cmli dXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJCSAgICAgICB0cmVlIEFS R19VTlVTRUQgKGFyZ3MpLAoJCQkgICAgICAgaW50IEFSR19VTlVTRUQgKGZs YWdzKSwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgLyogSWdub3JlIHRoZSBh dHRyaWJ1dGUgZm9yIGZ1bmN0aW9ucyBub3QgcmV0dXJuaW5nIGFueSB2YWx1 ZS4gICovCiAgaWYgKFZPSURfVFlQRV9QIChUUkVFX1RZUEUgKCpub2RlKSkp CiAgICB7CiAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywgIiVxRSBh dHRyaWJ1dGUgaWdub3JlZCIsIG5hbWUpOwogICAgICAqbm9fYWRkX2F0dHJz ID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFu ZGxlIGEgInNlbnRpbmVsIiBhdHRyaWJ1dGUuICAqLwoKc3RhdGljIHRyZWUK aGFuZGxlX3NlbnRpbmVsX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBu YW1lLCB0cmVlIGFyZ3MsCgkJCSAgIGludCBBUkdfVU5VU0VEIChmbGFncyks IGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUgcGFyYW1zID0gVFlQRV9B UkdfVFlQRVMgKCpub2RlKTsKCiAgaWYgKCFwYXJhbXMpCiAgICB7CiAgICAg IHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywKCSAgICAgICAiJXFFIGF0dHJp YnV0ZSByZXF1aXJlcyBwcm90b3R5cGVzIHdpdGggbmFtZWQgYXJndW1lbnRz IiwgbmFtZSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQog IGVsc2UKICAgIHsKICAgICAgd2hpbGUgKFRSRUVfQ0hBSU4gKHBhcmFtcykp CglwYXJhbXMgPSBUUkVFX0NIQUlOIChwYXJhbXMpOwoKICAgICAgaWYgKFZP SURfVFlQRV9QIChUUkVFX1ZBTFVFIChwYXJhbXMpKSkKCXsKCSAgd2Fybmlu ZyAoT1BUX1dhdHRyaWJ1dGVzLAoJCSAgICIlcUUgYXR0cmlidXRlIG9ubHkg YXBwbGllcyB0byB2YXJpYWRpYyBmdW5jdGlvbnMiLCBuYW1lKTsKCSAgKm5v X2FkZF9hdHRycyA9IHRydWU7Cgl9CiAgICB9CgogIGlmIChhcmdzKQogICAg ewogICAgICB0cmVlIHBvc2l0aW9uID0gVFJFRV9WQUxVRSAoYXJncyk7Cgog ICAgICBpZiAoVFJFRV9DT0RFIChwb3NpdGlvbikgIT0gSU5URUdFUl9DU1Qp Cgl7CgkgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywgCgkJICAgInJlcXVl c3RlZCBwb3NpdGlvbiBpcyBub3QgYW4gaW50ZWdlciBjb25zdGFudCIpOwoJ ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCX0KICAgICAgZWxzZQoJewoJICBp ZiAodHJlZV9pbnRfY3N0X2x0IChwb3NpdGlvbiwgaW50ZWdlcl96ZXJvX25v ZGUpKQoJICAgIHsKCSAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywK CQkgICAgICAgInJlcXVlc3RlZCBwb3NpdGlvbiBpcyBsZXNzIHRoYW4gemVy byIpOwoJICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CgkgICAgfQoJfQog ICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAidHlw ZV9nZW5lcmljIiBhdHRyaWJ1dGUuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxl X3R5cGVfZ2VuZXJpY19hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgQVJH X1VOVVNFRCAobmFtZSksCgkJCSAgICAgICB0cmVlIEFSR19VTlVTRUQgKGFy Z3MpLCBpbnQgQVJHX1VOVVNFRCAoZmxhZ3MpLAoJCQkgICAgICAgYm9vbCAq IEFSR19VTlVTRUQgKG5vX2FkZF9hdHRycykpCnsKICAvKiBFbnN1cmUgd2Ug aGF2ZSBhIGZ1bmN0aW9uIHR5cGUsIHdpdGggbm8gYXJndW1lbnRzLiAgKi8K ICBnY2NfYXNzZXJ0IChUUkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9U WVBFICYmICEgVFlQRV9BUkdfVFlQRVMgKCpub2RlKSk7CgogIHJldHVybiBO VUxMX1RSRUU7Cn0KDAovKiBDaGVjayBmb3IgdmFsaWQgYXJndW1lbnRzIGJl aW5nIHBhc3NlZCB0byBhIGZ1bmN0aW9uLgogICBBVFRSUyBpcyBhIGxpc3Qg b2YgYXR0cmlidXRlcy4gIFRoZXJlIGFyZSBOQVJHUyBhcmd1bWVudHMgaW4g dGhlIGFycmF5CiAgIEFSR0FSUkFZLiAgVFlQRUxJU1QgaXMgdGhlIGxpc3Qg b2YgYXJndW1lbnQgdHlwZXMgZm9yIHRoZSBmdW5jdGlvbi4KICovCnZvaWQK Y2hlY2tfZnVuY3Rpb25fYXJndW1lbnRzICh0cmVlIGF0dHJzLCBpbnQgbmFy Z3MsIHRyZWUgKmFyZ2FycmF5LCB0cmVlIHR5cGVsaXN0KQp7CiAgLyogQ2hl Y2sgZm9yIG51bGwgYmVpbmcgcGFzc2VkIGluIGEgcG9pbnRlciBhcmd1bWVu dCB0aGF0IG11c3QgYmUKICAgICBub24tbnVsbC4gIFdlIGFsc28gbmVlZCB0 byBkbyB0aGlzIGlmIGZvcm1hdCBjaGVja2luZyBpcyBlbmFibGVkLiAgKi8K CiAgaWYgKHdhcm5fbm9ubnVsbCkKICAgIGNoZWNrX2Z1bmN0aW9uX25vbm51 bGwgKGF0dHJzLCBuYXJncywgYXJnYXJyYXkpOwoKICAvKiBDaGVjayBmb3Ig ZXJyb3JzIGluIGZvcm1hdCBzdHJpbmdzLiAgKi8KCiAgaWYgKHdhcm5fZm9y bWF0IHx8IHdhcm5fbWlzc2luZ19mb3JtYXRfYXR0cmlidXRlKQogICAgY2hl Y2tfZnVuY3Rpb25fZm9ybWF0IChhdHRycywgbmFyZ3MsIGFyZ2FycmF5KTsK CiAgaWYgKHdhcm5fZm9ybWF0KQogICAgY2hlY2tfZnVuY3Rpb25fc2VudGlu ZWwgKGF0dHJzLCBuYXJncywgYXJnYXJyYXksIHR5cGVsaXN0KTsKfQoKLyog R2VuZXJpYyBhcmd1bWVudCBjaGVja2luZyByZWN1cnNpb24gcm91dGluZS4g IFBBUkFNIGlzIHRoZSBhcmd1bWVudCB0bwogICBiZSBjaGVja2VkLiAgUEFS QU1fTlVNIGlzIHRoZSBudW1iZXIgb2YgdGhlIGFyZ3VtZW50LiAgQ0FMTEJB Q0sgaXMgaW52b2tlZAogICBvbmNlIHRoZSBhcmd1bWVudCBpcyByZXNvbHZl ZC4gIENUWCBpcyBjb250ZXh0IGZvciB0aGUgY2FsbGJhY2suICAqLwp2b2lk CmNoZWNrX2Z1bmN0aW9uX2FyZ3VtZW50c19yZWN1cnNlICh2b2lkICgqY2Fs bGJhY2spCgkJCQkgICh2b2lkICosIHRyZWUsIHVuc2lnbmVkIEhPU1RfV0lE RV9JTlQpLAoJCQkJICB2b2lkICpjdHgsIHRyZWUgcGFyYW0sCgkJCQkgIHVu c2lnbmVkIEhPU1RfV0lERV9JTlQgcGFyYW1fbnVtKQp7CiAgaWYgKChUUkVF X0NPREUgKHBhcmFtKSA9PSBOT1BfRVhQUiB8fCBUUkVFX0NPREUgKHBhcmFt KSA9PSBDT05WRVJUX0VYUFIpCiAgICAgICYmIChUWVBFX1BSRUNJU0lPTiAo VFJFRV9UWVBFIChwYXJhbSkpCgkgID09IFRZUEVfUFJFQ0lTSU9OIChUUkVF X1RZUEUgKFRSRUVfT1BFUkFORCAocGFyYW0sIDApKSkpKQogICAgewogICAg ICAvKiBTdHJpcCBjb2VyY2lvbi4gICovCiAgICAgIGNoZWNrX2Z1bmN0aW9u X2FyZ3VtZW50c19yZWN1cnNlIChjYWxsYmFjaywgY3R4LAoJCQkJCVRSRUVf T1BFUkFORCAocGFyYW0sIDApLCBwYXJhbV9udW0pOwogICAgICByZXR1cm47 CiAgICB9CgogIGlmIChUUkVFX0NPREUgKHBhcmFtKSA9PSBDQUxMX0VYUFIp CiAgICB7CiAgICAgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoVFJFRV9UWVBF IChDQUxMX0VYUFJfRk4gKHBhcmFtKSkpOwogICAgICB0cmVlIGF0dHJzOwog ICAgICBib29sIGZvdW5kX2Zvcm1hdF9hcmcgPSBmYWxzZTsKCiAgICAgIC8q IFNlZSBpZiB0aGlzIGlzIGEgY2FsbCB0byBhIGtub3duIGludGVybmF0aW9u YWxpemF0aW9uIGZ1bmN0aW9uCgkgdGhhdCBtb2RpZmllcyBhIGZvcm1hdCBh cmcuICBTdWNoIGEgZnVuY3Rpb24gbWF5IGhhdmUgbXVsdGlwbGUKCSBmb3Jt YXRfYXJnIGF0dHJpYnV0ZXMgKGZvciBleGFtcGxlLCBuZ2V0dGV4dCkuICAq LwoKICAgICAgZm9yIChhdHRycyA9IFRZUEVfQVRUUklCVVRFUyAodHlwZSk7 CgkgICBhdHRyczsKCSAgIGF0dHJzID0gVFJFRV9DSEFJTiAoYXR0cnMpKQoJ aWYgKGlzX2F0dHJpYnV0ZV9wICgiZm9ybWF0X2FyZyIsIFRSRUVfUFVSUE9T RSAoYXR0cnMpKSkKCSAgewoJICAgIHRyZWUgaW5uZXJfYXJnOwoJICAgIHRy ZWUgZm9ybWF0X251bV9leHByOwoJICAgIGludCBmb3JtYXRfbnVtOwoJICAg IGludCBpOwoJICAgIGNhbGxfZXhwcl9hcmdfaXRlcmF0b3IgaXRlcjsKCgkg ICAgLyogRXh0cmFjdCB0aGUgYXJndW1lbnQgbnVtYmVyLCB3aGljaCB3YXMg cHJldmlvdXNseSBjaGVja2VkCgkgICAgICAgdG8gYmUgdmFsaWQuICAqLwoJ ICAgIGZvcm1hdF9udW1fZXhwciA9IFRSRUVfVkFMVUUgKFRSRUVfVkFMVUUg KGF0dHJzKSk7CgoJICAgIGdjY19hc3NlcnQgKFRSRUVfQ09ERSAoZm9ybWF0 X251bV9leHByKSA9PSBJTlRFR0VSX0NTVAoJCQkmJiAhVFJFRV9JTlRfQ1NU X0hJR0ggKGZvcm1hdF9udW1fZXhwcikpOwoKCSAgICBmb3JtYXRfbnVtID0g VFJFRV9JTlRfQ1NUX0xPVyAoZm9ybWF0X251bV9leHByKTsKCgkgICAgZm9y IChpbm5lcl9hcmcgPSBmaXJzdF9jYWxsX2V4cHJfYXJnIChwYXJhbSwgJml0 ZXIpLCBpID0gMTsKCQkgaW5uZXJfYXJnICE9IDA7CgkJIGlubmVyX2FyZyA9 IG5leHRfY2FsbF9leHByX2FyZyAoJml0ZXIpLCBpKyspCgkgICAgICBpZiAo aSA9PSBmb3JtYXRfbnVtKQoJCXsKCQkgIGNoZWNrX2Z1bmN0aW9uX2FyZ3Vt ZW50c19yZWN1cnNlIChjYWxsYmFjaywgY3R4LAoJCQkJCQkgICAgaW5uZXJf YXJnLCBwYXJhbV9udW0pOwoJCSAgZm91bmRfZm9ybWF0X2FyZyA9IHRydWU7 CgkJICBicmVhazsKCQl9CgkgIH0KCiAgICAgIC8qIElmIHdlIGZvdW5kIGEg Zm9ybWF0X2FyZyBhdHRyaWJ1dGUgYW5kIGRpZCBhIHJlY3Vyc2l2ZSBjaGVj aywKCSB3ZSBhcmUgZG9uZSB3aXRoIGNoZWNraW5nIHRoaXMgYXJndW1lbnQu ICBPdGhlcndpc2UsIHdlIGNvbnRpbnVlCgkgYW5kIHRoaXMgd2lsbCBiZSBj b25zaWRlcmVkIGEgbm9uLWxpdGVyYWwuICAqLwogICAgICBpZiAoZm91bmRf Zm9ybWF0X2FyZykKCXJldHVybjsKICAgIH0KCiAgaWYgKFRSRUVfQ09ERSAo cGFyYW0pID09IENPTkRfRVhQUikKICAgIHsKICAgICAgLyogQ2hlY2sgYm90 aCBoYWx2ZXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uICAqLwog ICAgICBjaGVja19mdW5jdGlvbl9hcmd1bWVudHNfcmVjdXJzZSAoY2FsbGJh Y2ssIGN0eCwKCQkJCQlUUkVFX09QRVJBTkQgKHBhcmFtLCAxKSwgcGFyYW1f bnVtKTsKICAgICAgY2hlY2tfZnVuY3Rpb25fYXJndW1lbnRzX3JlY3Vyc2Ug KGNhbGxiYWNrLCBjdHgsCgkJCQkJVFJFRV9PUEVSQU5EIChwYXJhbSwgMiks IHBhcmFtX251bSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgKCpjYWxsYmFj aykgKGN0eCwgcGFyYW0sIHBhcmFtX251bSk7Cn0KCi8qIEZ1bmN0aW9uIHRv IGhlbHAgcXNvcnQgc29ydCBGSUVMRF9ERUNMcyBieSBuYW1lIG9yZGVyLiAg Ki8KCmludApmaWVsZF9kZWNsX2NtcCAoY29uc3Qgdm9pZCAqeF9wLCBjb25z dCB2b2lkICp5X3ApCnsKICBjb25zdCB0cmVlICpjb25zdCB4ID0gKGNvbnN0 IHRyZWUgKmNvbnN0KSB4X3A7CiAgY29uc3QgdHJlZSAqY29uc3QgeSA9IChj b25zdCB0cmVlICpjb25zdCkgeV9wOwoKICBpZiAoREVDTF9OQU1FICgqeCkg PT0gREVDTF9OQU1FICgqeSkpCiAgICAvKiBBIG5vbnR5cGUgaXMgImdyZWF0 ZXIiIHRoYW4gYSB0eXBlLiAgKi8KICAgIHJldHVybiAoVFJFRV9DT0RFICgq eSkgPT0gVFlQRV9ERUNMKSAtIChUUkVFX0NPREUgKCp4KSA9PSBUWVBFX0RF Q0wpOwogIGlmIChERUNMX05BTUUgKCp4KSA9PSBOVUxMX1RSRUUpCiAgICBy ZXR1cm4gLTE7CiAgaWYgKERFQ0xfTkFNRSAoKnkpID09IE5VTExfVFJFRSkK ICAgIHJldHVybiAxOwogIGlmIChERUNMX05BTUUgKCp4KSA8IERFQ0xfTkFN RSAoKnkpKQogICAgcmV0dXJuIC0xOwogIHJldHVybiAxOwp9CgpzdGF0aWMg c3RydWN0IHsKICBndF9wb2ludGVyX29wZXJhdG9yIG5ld192YWx1ZTsKICB2 b2lkICpjb29raWU7Cn0gcmVzb3J0X2RhdGE7CgovKiBUaGlzIHJvdXRpbmUg Y29tcGFyZXMgdHdvIGZpZWxkcyBsaWtlIGZpZWxkX2RlY2xfY21wIGJ1dCB1 c2luZyB0aGUKcG9pbnRlciBvcGVyYXRvciBpbiByZXNvcnRfZGF0YS4gICov CgpzdGF0aWMgaW50CnJlc29ydF9maWVsZF9kZWNsX2NtcCAoY29uc3Qgdm9p ZCAqeF9wLCBjb25zdCB2b2lkICp5X3ApCnsKICBjb25zdCB0cmVlICpjb25z dCB4ID0gKGNvbnN0IHRyZWUgKmNvbnN0KSB4X3A7CiAgY29uc3QgdHJlZSAq Y29uc3QgeSA9IChjb25zdCB0cmVlICpjb25zdCkgeV9wOwoKICBpZiAoREVD TF9OQU1FICgqeCkgPT0gREVDTF9OQU1FICgqeSkpCiAgICAvKiBBIG5vbnR5 cGUgaXMgImdyZWF0ZXIiIHRoYW4gYSB0eXBlLiAgKi8KICAgIHJldHVybiAo VFJFRV9DT0RFICgqeSkgPT0gVFlQRV9ERUNMKSAtIChUUkVFX0NPREUgKCp4 KSA9PSBUWVBFX0RFQ0wpOwogIGlmIChERUNMX05BTUUgKCp4KSA9PSBOVUxM X1RSRUUpCiAgICByZXR1cm4gLTE7CiAgaWYgKERFQ0xfTkFNRSAoKnkpID09 IE5VTExfVFJFRSkKICAgIHJldHVybiAxOwogIHsKICAgIHRyZWUgZDEgPSBE RUNMX05BTUUgKCp4KTsKICAgIHRyZWUgZDIgPSBERUNMX05BTUUgKCp5KTsK ICAgIHJlc29ydF9kYXRhLm5ld192YWx1ZSAoJmQxLCByZXNvcnRfZGF0YS5j b29raWUpOwogICAgcmVzb3J0X2RhdGEubmV3X3ZhbHVlICgmZDIsIHJlc29y dF9kYXRhLmNvb2tpZSk7CiAgICBpZiAoZDEgPCBkMikKICAgICAgcmV0dXJu IC0xOwogIH0KICByZXR1cm4gMTsKfQoKLyogUmVzb3J0IERFQ0xfU09SVEVE X0ZJRUxEUyBiZWNhdXNlIHBvaW50ZXJzIGhhdmUgYmVlbiByZW9yZGVyZWQu ICAqLwoKdm9pZApyZXNvcnRfc29ydGVkX2ZpZWxkcyAodm9pZCAqb2JqLAoJ CSAgICAgIHZvaWQgKiBBUkdfVU5VU0VEIChvcmlnX29iaiksCgkJICAgICAg Z3RfcG9pbnRlcl9vcGVyYXRvciBuZXdfdmFsdWUsCgkJICAgICAgdm9pZCAq Y29va2llKQp7CiAgc3RydWN0IHNvcnRlZF9maWVsZHNfdHlwZSAqc2YgPSAo c3RydWN0IHNvcnRlZF9maWVsZHNfdHlwZSAqKSBvYmo7CiAgcmVzb3J0X2Rh dGEubmV3X3ZhbHVlID0gbmV3X3ZhbHVlOwogIHJlc29ydF9kYXRhLmNvb2tp ZSA9IGNvb2tpZTsKICBxc29ydCAoJnNmLT5lbHRzWzBdLCBzZi0+bGVuLCBz aXplb2YgKHRyZWUpLAoJIHJlc29ydF9maWVsZF9kZWNsX2NtcCk7Cn0KCi8q IFN1YnJvdXRpbmUgb2YgY19wYXJzZV9lcnJvci4KICAgUmV0dXJuIHRoZSBy ZXN1bHQgb2YgY29uY2F0ZW5hdGluZyBMSFMgYW5kIFJIUy4gUkhTIGlzIHJl YWxseQogICBhIHN0cmluZyBsaXRlcmFsLCBpdHMgZmlyc3QgY2hhcmFjdGVy IGlzIGluZGljYXRlZCBieSBSSFNfU1RBUlQgYW5kCiAgIFJIU19TSVpFIGlz IGl0cyBsZW5ndGggKGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMIGNo YXJhY3RlcikuCgogICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBk ZWxldGluZyB0aGUgcmV0dXJuZWQgcG9pbnRlci4gICovCgpzdGF0aWMgY2hh ciAqCmNhdGVuYXRlX3N0cmluZ3MgKGNvbnN0IGNoYXIgKmxocywgY29uc3Qg Y2hhciAqcmhzX3N0YXJ0LCBpbnQgcmhzX3NpemUpCnsKICBjb25zdCBpbnQg bGhzX3NpemUgPSBzdHJsZW4gKGxocyk7CiAgY2hhciAqcmVzdWx0ID0gWE5F V1ZFQyAoY2hhciwgbGhzX3NpemUgKyByaHNfc2l6ZSk7CiAgc3RybmNweSAo cmVzdWx0LCBsaHMsIGxoc19zaXplKTsKICBzdHJuY3B5IChyZXN1bHQgKyBs aHNfc2l6ZSwgcmhzX3N0YXJ0LCByaHNfc2l6ZSk7CiAgcmV0dXJuIHJlc3Vs dDsKfQoKLyogSXNzdWUgdGhlIGVycm9yIGdpdmVuIGJ5IEdNU0dJRCwgaW5k aWNhdGluZyB0aGF0IGl0IG9jY3VycmVkIGJlZm9yZQogICBUT0tFTiwgd2hp Y2ggaGFkIHRoZSBhc3NvY2lhdGVkIFZBTFVFLiAgKi8KCnZvaWQKY19wYXJz ZV9lcnJvciAoY29uc3QgY2hhciAqZ21zZ2lkLCBlbnVtIGNwcF90dHlwZSB0 b2tlbiwgdHJlZSB2YWx1ZSkKewojZGVmaW5lIGNhdGVuYXRlX21lc3NhZ2Vz KE0xLCBNMikgY2F0ZW5hdGVfc3RyaW5ncyAoKE0xKSwgKE0yKSwgc2l6ZW9m IChNMikpCgogIGNoYXIgKm1lc3NhZ2UgPSBOVUxMOwoKICBpZiAodG9rZW4g PT0gQ1BQX0VPRikKICAgIG1lc3NhZ2UgPSBjYXRlbmF0ZV9tZXNzYWdlcyAo Z21zZ2lkLCAiIGF0IGVuZCBvZiBpbnB1dCIpOwogIGVsc2UgaWYgKHRva2Vu ID09IENQUF9DSEFSIHx8IHRva2VuID09IENQUF9XQ0hBUikKICAgIHsKICAg ICAgdW5zaWduZWQgaW50IHZhbCA9IFRSRUVfSU5UX0NTVF9MT1cgKHZhbHVl KTsKICAgICAgY29uc3QgY2hhciAqY29uc3QgZWxsID0gKHRva2VuID09IENQ UF9DSEFSKSA/ICIiIDogIkwiOwogICAgICBpZiAodmFsIDw9IFVDSEFSX01B WCAmJiBJU0dSQVBIICh2YWwpKQoJbWVzc2FnZSA9IGNhdGVuYXRlX21lc3Nh Z2VzIChnbXNnaWQsICIgYmVmb3JlICVzJyVjJyIpOwogICAgICBlbHNlCglt ZXNzYWdlID0gY2F0ZW5hdGVfbWVzc2FnZXMgKGdtc2dpZCwgIiBiZWZvcmUg JXMnXFx4JXgnIik7CgogICAgICBlcnJvciAobWVzc2FnZSwgZWxsLCB2YWwp OwogICAgICBmcmVlIChtZXNzYWdlKTsKICAgICAgbWVzc2FnZSA9IE5VTEw7 CiAgICB9CiAgZWxzZSBpZiAodG9rZW4gPT0gQ1BQX1NUUklORyB8fCB0b2tl biA9PSBDUFBfV1NUUklORykKICAgIG1lc3NhZ2UgPSBjYXRlbmF0ZV9tZXNz YWdlcyAoZ21zZ2lkLCAiIGJlZm9yZSBzdHJpbmcgY29uc3RhbnQiKTsKICBl bHNlIGlmICh0b2tlbiA9PSBDUFBfTlVNQkVSKQogICAgbWVzc2FnZSA9IGNh dGVuYXRlX21lc3NhZ2VzIChnbXNnaWQsICIgYmVmb3JlIG51bWVyaWMgY29u c3RhbnQiKTsKICBlbHNlIGlmICh0b2tlbiA9PSBDUFBfTkFNRSkKICAgIHsK ICAgICAgbWVzc2FnZSA9IGNhdGVuYXRlX21lc3NhZ2VzIChnbXNnaWQsICIg YmVmb3JlICVxRSIpOwogICAgICBlcnJvciAobWVzc2FnZSwgdmFsdWUpOwog ICAgICBmcmVlIChtZXNzYWdlKTsKICAgICAgbWVzc2FnZSA9IE5VTEw7CiAg ICB9CiAgZWxzZSBpZiAodG9rZW4gPT0gQ1BQX1BSQUdNQSkKICAgIG1lc3Nh Z2UgPSBjYXRlbmF0ZV9tZXNzYWdlcyAoZ21zZ2lkLCAiIGJlZm9yZSAlPCNw cmFnbWElPiIpOwogIGVsc2UgaWYgKHRva2VuID09IENQUF9QUkFHTUFfRU9M KQogICAgbWVzc2FnZSA9IGNhdGVuYXRlX21lc3NhZ2VzIChnbXNnaWQsICIg YmVmb3JlIGVuZCBvZiBsaW5lIik7CiAgZWxzZSBpZiAodG9rZW4gPCBOX1RU WVBFUykKICAgIHsKICAgICAgbWVzc2FnZSA9IGNhdGVuYXRlX21lc3NhZ2Vz IChnbXNnaWQsICIgYmVmb3JlICVxcyB0b2tlbiIpOwogICAgICBlcnJvciAo bWVzc2FnZSwgY3BwX3R5cGUybmFtZSAodG9rZW4pKTsKICAgICAgZnJlZSAo bWVzc2FnZSk7CiAgICAgIG1lc3NhZ2UgPSBOVUxMOwogICAgfQogIGVsc2UK ICAgIGVycm9yIChnbXNnaWQpOwoKICBpZiAobWVzc2FnZSkKICAgIHsKICAg ICAgZXJyb3IgKG1lc3NhZ2UpOwogICAgICBmcmVlIChtZXNzYWdlKTsKICAg IH0KI3VuZGVmIGNhdGVuYXRlX21lc3NhZ2VzCn0KCi8qIFdhbGsgYSBnaW1w bGlmaWVkIGZ1bmN0aW9uIGFuZCB3YXJuIGZvciBmdW5jdGlvbnMgd2hvc2Ug cmV0dXJuIHZhbHVlIGlzCiAgIGlnbm9yZWQgYW5kIGF0dHJpYnV0ZSgod2Fy bl91bnVzZWRfcmVzdWx0KSkgaXMgc2V0LiAgVGhpcyBpcyBkb25lIGJlZm9y ZQogICBpbmxpbmluZywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91 dCB0aGF0LiAgKi8KCnZvaWQKY193YXJuX3VudXNlZF9yZXN1bHQgKHRyZWUg KnRvcF9wKQp7CiAgdHJlZSB0ID0gKnRvcF9wOwogIHRyZWVfc3RtdF9pdGVy YXRvciBpOwogIHRyZWUgZmRlY2wsIGZ0eXBlOwoKICBzd2l0Y2ggKFRSRUVf Q09ERSAodCkpCiAgICB7CiAgICBjYXNlIFNUQVRFTUVOVF9MSVNUOgogICAg ICBmb3IgKGkgPSB0c2lfc3RhcnQgKCp0b3BfcCk7ICF0c2lfZW5kX3AgKGkp OyB0c2lfbmV4dCAoJmkpKQoJY193YXJuX3VudXNlZF9yZXN1bHQgKHRzaV9z dG10X3B0ciAoaSkpOwogICAgICBicmVhazsKCiAgICBjYXNlIENPTkRfRVhQ UjoKICAgICAgY193YXJuX3VudXNlZF9yZXN1bHQgKCZDT05EX0VYUFJfVEhF TiAodCkpOwogICAgICBjX3dhcm5fdW51c2VkX3Jlc3VsdCAoJkNPTkRfRVhQ Ul9FTFNFICh0KSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBCSU5EX0VYUFI6 CiAgICAgIGNfd2Fybl91bnVzZWRfcmVzdWx0ICgmQklORF9FWFBSX0JPRFkg KHQpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFRSWV9GSU5BTExZX0VYUFI6 CiAgICBjYXNlIFRSWV9DQVRDSF9FWFBSOgogICAgICBjX3dhcm5fdW51c2Vk X3Jlc3VsdCAoJlRSRUVfT1BFUkFORCAodCwgMCkpOwogICAgICBjX3dhcm5f dW51c2VkX3Jlc3VsdCAoJlRSRUVfT1BFUkFORCAodCwgMSkpOwogICAgICBi cmVhazsKICAgIGNhc2UgQ0FUQ0hfRVhQUjoKICAgICAgY193YXJuX3VudXNl ZF9yZXN1bHQgKCZDQVRDSF9CT0RZICh0KSk7CiAgICAgIGJyZWFrOwogICAg Y2FzZSBFSF9GSUxURVJfRVhQUjoKICAgICAgY193YXJuX3VudXNlZF9yZXN1 bHQgKCZFSF9GSUxURVJfRkFJTFVSRSAodCkpOwogICAgICBicmVhazsKCiAg ICBjYXNlIENBTExfRVhQUjoKICAgICAgaWYgKFRSRUVfVVNFRCAodCkpCgli cmVhazsKCiAgICAgIC8qIFRoaXMgaXMgYSBuYWtlZCBjYWxsLCBhcyBvcHBv c2VkIHRvIGEgQ0FMTF9FWFBSIG5lc3RlZCBpbnNpZGUKCSBhIE1PRElGWV9F WFBSLiAgQWxsIGNhbGxzIHdob3NlIHZhbHVlIGlzIGlnbm9yZWQgc2hvdWxk IGJlCgkgcmVwcmVzZW50ZWQgbGlrZSB0aGlzLiAgTG9vayBmb3IgdGhlIGF0 dHJpYnV0ZS4gICovCiAgICAgIGZkZWNsID0gZ2V0X2NhbGxlZV9mbmRlY2wg KHQpOwogICAgICBpZiAoZmRlY2wpCglmdHlwZSA9IFRSRUVfVFlQRSAoZmRl Y2wpOwogICAgICBlbHNlCgl7CgkgIGZ0eXBlID0gVFJFRV9UWVBFIChDQUxM X0VYUFJfRk4gKHQpKTsKCSAgLyogTG9vayBwYXN0IHBvaW50ZXItdG8tZnVu Y3Rpb24gdG8gdGhlIGZ1bmN0aW9uIHR5cGUgaXRzZWxmLiAgKi8KCSAgZnR5 cGUgPSBUUkVFX1RZUEUgKGZ0eXBlKTsKCX0KCiAgICAgIGlmIChsb29rdXBf YXR0cmlidXRlICgid2Fybl91bnVzZWRfcmVzdWx0IiwgVFlQRV9BVFRSSUJV VEVTIChmdHlwZSkpKQoJewoJICBpZiAoZmRlY2wpCgkgICAgd2FybmluZyAo MCwgIiVIaWdub3JpbmcgcmV0dXJuIHZhbHVlIG9mICVxRCwgIgoJCSAgICAg ImRlY2xhcmVkIHdpdGggYXR0cmlidXRlIHdhcm5fdW51c2VkX3Jlc3VsdCIs CgkJICAgICBFWFBSX0xPQ1VTICh0KSwgZmRlY2wpOwoJICBlbHNlCgkgICAg d2FybmluZyAoMCwgIiVIaWdub3JpbmcgcmV0dXJuIHZhbHVlIG9mIGZ1bmN0 aW9uICIKCQkgICAgICJkZWNsYXJlZCB3aXRoIGF0dHJpYnV0ZSB3YXJuX3Vu dXNlZF9yZXN1bHQiLAoJCSAgICAgRVhQUl9MT0NVUyAodCkpOwoJfQogICAg ICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAvKiBOb3QgYSBjb250YWlu ZXIsIG5vdCBhIGNhbGwsIG9yIGEgY2FsbCB3aG9zZSB2YWx1ZSBpcyB1c2Vk LiAgKi8KICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qIENvbnZlcnQgYSBjaGFy YWN0ZXIgZnJvbSB0aGUgaG9zdCB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBj aGFyYWN0ZXIKICAgc2V0LiAgY3BwbGliIGhhbmRsZXMgdGhpcywgbW9zdGx5 LiAgKi8KCkhPU1RfV0lERV9JTlQKY19jb21tb25fdG9fdGFyZ2V0X2NoYXJz ZXQgKEhPU1RfV0lERV9JTlQgYykKewogIC8qIENoYXJhY3RlciBjb25zdGFu dHMgaW4gR0NDIHByb3BlciBhcmUgc2lnbi1leHRlbmRlZCB1bmRlciAtZnNp Z25lZC1jaGFyLAogICAgIHplcm8tZXh0ZW5kZWQgdW5kZXIgLWZuby1zaWdu ZWQtY2hhci4gIGNwcGxpYiBpbnNpc3RzIHRoYXQgY2hhcmFjdGVycwogICAg IGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBhbHdheXMgdW5zaWduZWQu ICBIZW5jZSB3ZSBtdXN0IGNvbnZlcnQKICAgICBiYWNrIGFuZCBmb3J0aC4g ICovCiAgY3BwY2hhcl90IHVjID0gKChjcHBjaGFyX3QpYykgJiAoKCgoY3Bw Y2hhcl90KTEpIDw8IENIQVJfQklUKS0xKTsKCiAgdWMgPSBjcHBfaG9zdF90 b19leGVjX2NoYXJzZXQgKHBhcnNlX2luLCB1Yyk7CgogIGlmIChmbGFnX3Np Z25lZF9jaGFyKQogICAgcmV0dXJuICgoSE9TVF9XSURFX0lOVCl1YykgPDwg KEhPU1RfQklUU19QRVJfV0lERV9JTlQgLSBDSEFSX1RZUEVfU0laRSkKCQkJ ICAgICAgID4+IChIT1NUX0JJVFNfUEVSX1dJREVfSU5UIC0gQ0hBUl9UWVBF X1NJWkUpOwogIGVsc2UKICAgIHJldHVybiB1YzsKfQoKLyogQnVpbGQgdGhl IHJlc3VsdCBvZiBfX2J1aWx0aW5fb2Zmc2V0b2YuICBFWFBSIGlzIGEgbmVz dGVkIHNlcXVlbmNlIG9mCiAgIGNvbXBvbmVudCByZWZlcmVuY2VzLCB3aXRo IFNUT1BfUkVGLCBvciBhbHRlcm5hdGl2ZWx5IGFuIElORElSRUNUX1JFRiBv ZgogICBOVUxMLCBhdCB0aGUgYm90dG9tOyBtdWNoIGxpa2UgdGhlIHRyYWRp dGlvbmFsIHJlbmRlcmluZyBvZiBvZmZzZXRvZiBhcyBhCiAgIG1hY3JvLiAg UmV0dXJucyB0aGUgZm9sZGVkIGFuZCBwcm9wZXJseSBjYXN0IHJlc3VsdC4g ICovCgpzdGF0aWMgdHJlZQpmb2xkX29mZnNldG9mXzEgKHRyZWUgZXhwciwg dHJlZSBzdG9wX3JlZikKewogIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBQTFVT X0VYUFI7CiAgdHJlZSBiYXNlLCBvZmYsIHQ7CgogIGlmIChleHByID09IHN0 b3BfcmVmICYmIFRSRUVfQ09ERSAoZXhwcikgIT0gRVJST1JfTUFSSykKICAg IHJldHVybiBzaXplX3plcm9fbm9kZTsKCiAgc3dpdGNoIChUUkVFX0NPREUg KGV4cHIpKQogICAgewogICAgY2FzZSBFUlJPUl9NQVJLOgogICAgICByZXR1 cm4gZXhwcjsKCiAgICBjYXNlIFZBUl9ERUNMOgogICAgICBlcnJvciAoImNh bm5vdCBhcHBseSAlPG9mZnNldG9mJT4gdG8gc3RhdGljIGRhdGEgbWVtYmVy ICVxRCIsIGV4cHIpOwogICAgICByZXR1cm4gZXJyb3JfbWFya19ub2RlOwoK ICAgIGNhc2UgQ0FMTF9FWFBSOgogICAgICBlcnJvciAoImNhbm5vdCBhcHBs eSAlPG9mZnNldG9mJT4gd2hlbiAlPG9wZXJhdG9yW10lPiBpcyBvdmVybG9h ZGVkIik7CiAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7CgogICAgY2Fz ZSBJTlRFR0VSX0NTVDoKICAgICAgZ2NjX2Fzc2VydCAoaW50ZWdlcl96ZXJv cCAoZXhwcikpOwogICAgICByZXR1cm4gc2l6ZV96ZXJvX25vZGU7CgogICAg Y2FzZSBOT1BfRVhQUjoKICAgIGNhc2UgSU5ESVJFQ1RfUkVGOgogICAgICBi YXNlID0gZm9sZF9vZmZzZXRvZl8xIChUUkVFX09QRVJBTkQgKGV4cHIsIDAp LCBzdG9wX3JlZik7CiAgICAgIGdjY19hc3NlcnQgKGJhc2UgPT0gZXJyb3Jf bWFya19ub2RlIHx8IGJhc2UgPT0gc2l6ZV96ZXJvX25vZGUpOwogICAgICBy ZXR1cm4gYmFzZTsKCiAgICBjYXNlIENPTVBPTkVOVF9SRUY6CiAgICAgIGJh c2UgPSBmb2xkX29mZnNldG9mXzEgKFRSRUVfT1BFUkFORCAoZXhwciwgMCks IHN0b3BfcmVmKTsKICAgICAgaWYgKGJhc2UgPT0gZXJyb3JfbWFya19ub2Rl KQoJcmV0dXJuIGJhc2U7CgogICAgICB0ID0gVFJFRV9PUEVSQU5EIChleHBy LCAxKTsKICAgICAgaWYgKERFQ0xfQ19CSVRfRklFTEQgKHQpKQoJewoJICBl cnJvciAoImF0dGVtcHQgdG8gdGFrZSBhZGRyZXNzIG9mIGJpdC1maWVsZCBz dHJ1Y3R1cmUgIgoJCSAibWVtYmVyICVxRCIsIHQpOwoJICByZXR1cm4gZXJy b3JfbWFya19ub2RlOwoJfQogICAgICBvZmYgPSBzaXplX2Jpbm9wIChQTFVT X0VYUFIsIERFQ0xfRklFTERfT0ZGU0VUICh0KSwKCQkJc2l6ZV9pbnQgKHRy ZWVfbG93X2NzdCAoREVDTF9GSUVMRF9CSVRfT0ZGU0VUICh0KSwgMSkKCQkJ CSAgLyBCSVRTX1BFUl9VTklUKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2Ug QVJSQVlfUkVGOgogICAgICBiYXNlID0gZm9sZF9vZmZzZXRvZl8xIChUUkVF X09QRVJBTkQgKGV4cHIsIDApLCBzdG9wX3JlZik7CiAgICAgIGlmIChiYXNl ID09IGVycm9yX21hcmtfbm9kZSkKCXJldHVybiBiYXNlOwoKICAgICAgdCA9 IFRSRUVfT1BFUkFORCAoZXhwciwgMSk7CiAgICAgIGlmIChUUkVFX0NPREUg KHQpID09IElOVEVHRVJfQ1NUICYmIHRyZWVfaW50X2NzdF9zZ24gKHQpIDwg MCkKCXsKCSAgY29kZSA9IE1JTlVTX0VYUFI7CgkgIHQgPSBmb2xkX2J1aWxk MSAoTkVHQVRFX0VYUFIsIFRSRUVfVFlQRSAodCksIHQpOwoJfQogICAgICB0 ID0gY29udmVydCAoc2l6ZXR5cGUsIHQpOwogICAgICBvZmYgPSBzaXplX2Jp bm9wIChNVUxUX0VYUFIsIFRZUEVfU0laRV9VTklUIChUUkVFX1RZUEUgKGV4 cHIpKSwgdCk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ09NUE9VTkRfRVhQ UjoKICAgICAgLyogSGFuZGxlIHN0YXRpYyBtZW1iZXJzIG9mIHZvbGF0aWxl IHN0cnVjdHMuICAqLwogICAgICB0ID0gVFJFRV9PUEVSQU5EIChleHByLCAx KTsKICAgICAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFICh0KSA9PSBWQVJfREVD TCk7CiAgICAgIHJldHVybiBmb2xkX29mZnNldG9mXzEgKHQsIHN0b3BfcmVm KTsKCiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAg ICB9CgogIHJldHVybiBzaXplX2Jpbm9wIChjb2RlLCBiYXNlLCBvZmYpOwp9 Cgp0cmVlCmZvbGRfb2Zmc2V0b2YgKHRyZWUgZXhwciwgdHJlZSBzdG9wX3Jl ZikKewogIC8qIENvbnZlcnQgYmFjayBmcm9tIHRoZSBpbnRlcm5hbCBzaXpl dHlwZSB0byBzaXplX3QuICAqLwogIHJldHVybiBjb252ZXJ0IChzaXplX3R5 cGVfbm9kZSwgZm9sZF9vZmZzZXRvZl8xIChleHByLCBzdG9wX3JlZikpOwp9 CgovKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGZvciBhbiBpbnZhbGlkIGx2 YWx1ZS4gIFVTRSBzYXlzCiAgIGhvdyB0aGUgbHZhbHVlIGlzIGJlaW5nIHVz ZWQgYW5kIHNvIHNlbGVjdHMgdGhlIGVycm9yIG1lc3NhZ2UuICAqLwoKdm9p ZApsdmFsdWVfZXJyb3IgKGVudW0gbHZhbHVlX3VzZSB1c2UpCnsKICBzd2l0 Y2ggKHVzZSkKICAgIHsKICAgIGNhc2UgbHZfYXNzaWduOgogICAgICBlcnJv ciAoImx2YWx1ZSByZXF1aXJlZCBhcyBsZWZ0IG9wZXJhbmQgb2YgYXNzaWdu bWVudCIpOwogICAgICBicmVhazsKICAgIGNhc2UgbHZfaW5jcmVtZW50Ogog ICAgICBlcnJvciAoImx2YWx1ZSByZXF1aXJlZCBhcyBpbmNyZW1lbnQgb3Bl cmFuZCIpOwogICAgICBicmVhazsKICAgIGNhc2UgbHZfZGVjcmVtZW50Ogog ICAgICBlcnJvciAoImx2YWx1ZSByZXF1aXJlZCBhcyBkZWNyZW1lbnQgb3Bl cmFuZCIpOwogICAgICBicmVhazsKICAgIGNhc2UgbHZfYWRkcmVzc29mOgog ICAgICBlcnJvciAoImx2YWx1ZSByZXF1aXJlZCBhcyB1bmFyeSAlPCYlPiBv cGVyYW5kIik7CiAgICAgIGJyZWFrOwogICAgY2FzZSBsdl9hc206CiAgICAg IGVycm9yICgibHZhbHVlIHJlcXVpcmVkIGluIGFzbSBzdGF0ZW1lbnQiKTsK ICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5yZWFjaGFi bGUgKCk7CiAgICB9Cn0KDAovKiAqUFRZUEUgaXMgYW4gaW5jb21wbGV0ZSBh cnJheS4gIENvbXBsZXRlIGl0IHdpdGggYSBkb21haW4gYmFzZWQgb24KICAg SU5JVElBTF9WQUxVRS4gIElmIElOSVRJQUxfVkFMVUUgaXMgbm90IHByZXNl bnQsIHVzZSAxIGlmIERPX0RFRkFVTFQKICAgaXMgdHJ1ZS4gIFJldHVybiAw IGlmIHN1Y2Nlc3NmdWwsIDEgaWYgSU5JVElBTF9WQUxVRSBjYW4ndCBiZSBk ZWNpcGhlcmVkLAogICAyIGlmIElOSVRJQUxfVkFMVUUgd2FzIE5VTEwsIGFu ZCAzIGlmIElOSVRJQUxfVkFMVUUgd2FzIGVtcHR5LiAgKi8KCmludApjb21w bGV0ZV9hcnJheV90eXBlICh0cmVlICpwdHlwZSwgdHJlZSBpbml0aWFsX3Zh bHVlLCBib29sIGRvX2RlZmF1bHQpCnsKICB0cmVlIG1heGluZGV4LCB0eXBl LCBtYWluX3R5cGUsIGVsdCwgdW5xdWFsX2VsdDsKICBpbnQgZmFpbHVyZSA9 IDAsIHF1YWxzOwogIGhhc2h2YWxfdCBoYXNoY29kZSA9IDA7CgogIG1heGlu ZGV4ID0gc2l6ZV96ZXJvX25vZGU7CiAgaWYgKGluaXRpYWxfdmFsdWUpCiAg ICB7CiAgICAgIGlmIChUUkVFX0NPREUgKGluaXRpYWxfdmFsdWUpID09IFNU UklOR19DU1QpCgl7CgkgIGludCBlbHRzaXplCgkgICAgPSBpbnRfc2l6ZV9p bl9ieXRlcyAoVFJFRV9UWVBFIChUUkVFX1RZUEUgKGluaXRpYWxfdmFsdWUp KSk7CgkgIG1heGluZGV4ID0gc2l6ZV9pbnQgKFRSRUVfU1RSSU5HX0xFTkdU SCAoaW5pdGlhbF92YWx1ZSkvZWx0c2l6ZSAtIDEpOwoJfQogICAgICBlbHNl IGlmIChUUkVFX0NPREUgKGluaXRpYWxfdmFsdWUpID09IENPTlNUUlVDVE9S KQoJewoJICBWRUMoY29uc3RydWN0b3JfZWx0LGdjKSAqdiA9IENPTlNUUlVD VE9SX0VMVFMgKGluaXRpYWxfdmFsdWUpOwoKCSAgaWYgKFZFQ19lbXB0eSAo Y29uc3RydWN0b3JfZWx0LCB2KSkKCSAgICB7CgkgICAgICBpZiAocGVkYW50 aWMpCgkJZmFpbHVyZSA9IDM7CgkgICAgICBtYXhpbmRleCA9IGludGVnZXJf bWludXNfb25lX25vZGU7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAg dHJlZSBjdXJpbmRleDsKCSAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQg Y250OwoJICAgICAgY29uc3RydWN0b3JfZWx0ICpjZTsKCgkgICAgICBpZiAo VkVDX2luZGV4IChjb25zdHJ1Y3Rvcl9lbHQsIHYsIDApLT5pbmRleCkKCQlt YXhpbmRleCA9IGZvbGRfY29udmVydCAoc2l6ZXR5cGUsCgkJCQkJIFZFQ19p bmRleCAoY29uc3RydWN0b3JfZWx0LAoJCQkJCQkgICAgdiwgMCktPmluZGV4 KTsKCSAgICAgIGN1cmluZGV4ID0gbWF4aW5kZXg7CgoJICAgICAgZm9yIChj bnQgPSAxOwoJCSAgIFZFQ19pdGVyYXRlIChjb25zdHJ1Y3Rvcl9lbHQsIHYs IGNudCwgY2UpOwoJCSAgIGNudCsrKQoJCXsKCQkgIGlmIChjZS0+aW5kZXgp CgkJICAgIGN1cmluZGV4ID0gZm9sZF9jb252ZXJ0IChzaXpldHlwZSwgY2Ut PmluZGV4KTsKCQkgIGVsc2UKCQkgICAgY3VyaW5kZXggPSBzaXplX2Jpbm9w IChQTFVTX0VYUFIsIGN1cmluZGV4LCBzaXplX29uZV9ub2RlKTsKCgkJICBp ZiAodHJlZV9pbnRfY3N0X2x0IChtYXhpbmRleCwgY3VyaW5kZXgpKQoJCSAg ICBtYXhpbmRleCA9IGN1cmluZGV4OwoJCX0KCSAgICB9Cgl9CiAgICAgIGVs c2UKCXsKCSAgLyogTWFrZSBhbiBlcnJvciBtZXNzYWdlIHVubGVzcyB0aGF0 IGhhcHBlbmVkIGFscmVhZHkuICAqLwoJICBpZiAoaW5pdGlhbF92YWx1ZSAh PSBlcnJvcl9tYXJrX25vZGUpCgkgICAgZmFpbHVyZSA9IDE7Cgl9CiAgICB9 CiAgZWxzZQogICAgewogICAgICBmYWlsdXJlID0gMjsKICAgICAgaWYgKCFk b19kZWZhdWx0KQoJcmV0dXJuIGZhaWx1cmU7CiAgICB9CgogIHR5cGUgPSAq cHR5cGU7CiAgZWx0ID0gVFJFRV9UWVBFICh0eXBlKTsKICBxdWFscyA9IFRZ UEVfUVVBTFMgKHN0cmlwX2FycmF5X3R5cGVzIChlbHQpKTsKICBpZiAocXVh bHMgPT0gMCkKICAgIHVucXVhbF9lbHQgPSBlbHQ7CiAgZWxzZQogICAgdW5x dWFsX2VsdCA9IGNfYnVpbGRfcXVhbGlmaWVkX3R5cGUgKGVsdCwgVFlQRV9V TlFVQUxJRklFRCk7CgogIC8qIFVzaW5nIGJ1aWxkX2Rpc3RpbmN0X3R5cGVf Y29weSBhbmQgbW9kaWZ5aW5nIHRoaW5ncyBhZnRlcndhcmQgaW5zdGVhZAog ICAgIG9mIHVzaW5nIGJ1aWxkX2FycmF5X3R5cGUgdG8gY3JlYXRlIGEgbmV3 IHR5cGUgcHJlc2VydmVzIGFsbCBvZiB0aGUKICAgICBUWVBFX0xBTkdfRkxB R18/IGJpdHMgdGhhdCB0aGUgZnJvbnQgZW5kIG1heSBoYXZlIHNldC4gICov CiAgbWFpbl90eXBlID0gYnVpbGRfZGlzdGluY3RfdHlwZV9jb3B5IChUWVBF X01BSU5fVkFSSUFOVCAodHlwZSkpOwogIFRSRUVfVFlQRSAobWFpbl90eXBl KSA9IHVucXVhbF9lbHQ7CiAgVFlQRV9ET01BSU4gKG1haW5fdHlwZSkgPSBi dWlsZF9pbmRleF90eXBlIChtYXhpbmRleCk7CiAgbGF5b3V0X3R5cGUgKG1h aW5fdHlwZSk7CgogIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjYW5vbmlj YWwgTUFJTl9UWVBFLiAqLwogIGhhc2hjb2RlID0gaXRlcmF0aXZlX2hhc2hf b2JqZWN0IChUWVBFX0hBU0ggKHVucXVhbF9lbHQpLCBoYXNoY29kZSk7CiAg aGFzaGNvZGUgPSBpdGVyYXRpdmVfaGFzaF9vYmplY3QgKFRZUEVfSEFTSCAo VFlQRV9ET01BSU4gKG1haW5fdHlwZSkpLCAKCQkJCSAgICBoYXNoY29kZSk7 CiAgbWFpbl90eXBlID0gdHlwZV9oYXNoX2Nhbm9uIChoYXNoY29kZSwgbWFp bl90eXBlKTsKCiAgLyogRml4IHRoZSBjYW5vbmljYWwgdHlwZS4gICovCiAg aWYgKFRZUEVfU1RSVUNUVVJBTF9FUVVBTElUWV9QIChUUkVFX1RZUEUgKG1h aW5fdHlwZSkpCiAgICAgIHx8IFRZUEVfU1RSVUNUVVJBTF9FUVVBTElUWV9Q IChUWVBFX0RPTUFJTiAobWFpbl90eXBlKSkpCiAgICBTRVRfVFlQRV9TVFJV Q1RVUkFMX0VRVUFMSVRZIChtYWluX3R5cGUpOwogIGVsc2UgaWYgKFRZUEVf Q0FOT05JQ0FMIChUUkVFX1RZUEUgKG1haW5fdHlwZSkpICE9IFRSRUVfVFlQ RSAobWFpbl90eXBlKQoJICAgfHwgKFRZUEVfQ0FOT05JQ0FMIChUWVBFX0RP TUFJTiAobWFpbl90eXBlKSkKCSAgICAgICAhPSBUWVBFX0RPTUFJTiAobWFp bl90eXBlKSkpCiAgICBUWVBFX0NBTk9OSUNBTCAobWFpbl90eXBlKSAKICAg ICAgPSBidWlsZF9hcnJheV90eXBlIChUWVBFX0NBTk9OSUNBTCAoVFJFRV9U WVBFIChtYWluX3R5cGUpKSwKCQkJICBUWVBFX0NBTk9OSUNBTCAoVFlQRV9E T01BSU4gKG1haW5fdHlwZSkpKTsKICBlbHNlCiAgICBUWVBFX0NBTk9OSUNB TCAobWFpbl90eXBlKSA9IG1haW5fdHlwZTsKCiAgaWYgKHF1YWxzID09IDAp CiAgICB0eXBlID0gbWFpbl90eXBlOwogIGVsc2UKICAgIHR5cGUgPSBjX2J1 aWxkX3F1YWxpZmllZF90eXBlIChtYWluX3R5cGUsIHF1YWxzKTsKCiAgaWYg KENPTVBMRVRFX1RZUEVfUCAodHlwZSkKICAgICAgJiYgVFJFRV9DT0RFIChU WVBFX1NJWkVfVU5JVCAodHlwZSkpID09IElOVEVHRVJfQ1NUCiAgICAgICYm IFRSRUVfT1ZFUkZMT1cgKFRZUEVfU0laRV9VTklUICh0eXBlKSkpCiAgICB7 CiAgICAgIGVycm9yICgic2l6ZSBvZiBhcnJheSBpcyB0b28gbGFyZ2UiKTsK ICAgICAgLyogSWYgd2UgcHJvY2VlZCB3aXRoIHRoZSBhcnJheSB0eXBlIGFz IGl0IGlzLCB3ZSdsbCBldmVudHVhbGx5CgkgY3Jhc2ggaW4gdHJlZV9sb3df Y3N0KCkuICAqLwogICAgICB0eXBlID0gZXJyb3JfbWFya19ub2RlOwogICAg fQoKICAqcHR5cGUgPSB0eXBlOwogIHJldHVybiBmYWlsdXJlOwp9CgoMCi8q IFVzZWQgdG8gaGVscCBpbml0aWFsaXplIHRoZSBidWlsdGluLXR5cGVzLmRl ZiB0YWJsZS4gIFdoZW4gYSB0eXBlIG9mCiAgIHRoZSBjb3JyZWN0IHNpemUg ZG9lc24ndCBleGlzdCwgdXNlIGVycm9yX21hcmtfbm9kZSBpbnN0ZWFkIG9m IE5VTEwuCiAgIFRoZSBsYXRlciByZXN1bHRzIGluIHNlZ2ZhdWx0cyBldmVu IHdoZW4gYSBkZWNsIHVzaW5nIHRoZSB0eXBlIGRvZXNuJ3QKICAgZ2V0IGlu dm9rZWQuICAqLwoKdHJlZQpidWlsdGluX3R5cGVfZm9yX3NpemUgKGludCBz aXplLCBib29sIHVuc2lnbmVkcCkKewogIHRyZWUgdHlwZSA9IGxhbmdfaG9v a3MudHlwZXMudHlwZV9mb3Jfc2l6ZSAoc2l6ZSwgdW5zaWduZWRwKTsKICBy ZXR1cm4gdHlwZSA/IHR5cGUgOiBlcnJvcl9tYXJrX25vZGU7Cn0KCi8qIEEg aGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZlX292ZXJsb2FkZWRfYnVpbHRp biBpbiByZXNvbHZpbmcgdGhlCiAgIG92ZXJsb2FkZWQgX19zeW5jXyBidWls dGlucy4gIFJldHVybnMgYSBwb3NpdGl2ZSBwb3dlciBvZiAyIGlmIHRoZQog ICBmaXJzdCBvcGVyYW5kIG9mIFBBUkFNUyBpcyBhIHBvaW50ZXIgdG8gYSBz dXBwb3J0ZWQgZGF0YSB0eXBlLgogICBSZXR1cm5zIDAgaWYgYW4gZXJyb3Ig aXMgZW5jb3VudGVyZWQuICAqLwoKc3RhdGljIGludApzeW5jX3Jlc29sdmVf c2l6ZSAodHJlZSBmdW5jdGlvbiwgdHJlZSBwYXJhbXMpCnsKICB0cmVlIHR5 cGU7CiAgaW50IHNpemU7CgogIGlmIChwYXJhbXMgPT0gTlVMTCkKICAgIHsK ICAgICAgZXJyb3IgKCJ0b28gZmV3IGFyZ3VtZW50cyB0byBmdW5jdGlvbiAl cUUiLCBmdW5jdGlvbik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICB0eXBl ID0gVFJFRV9UWVBFIChUUkVFX1ZBTFVFIChwYXJhbXMpKTsKICBpZiAoVFJF RV9DT0RFICh0eXBlKSAhPSBQT0lOVEVSX1RZUEUpCiAgICBnb3RvIGluY29t cGF0aWJsZTsKCiAgdHlwZSA9IFRSRUVfVFlQRSAodHlwZSk7CiAgaWYgKCFJ TlRFR1JBTF9UWVBFX1AgKHR5cGUpICYmICFQT0lOVEVSX1RZUEVfUCAodHlw ZSkpCiAgICBnb3RvIGluY29tcGF0aWJsZTsKCiAgc2l6ZSA9IHRyZWVfbG93 X2NzdCAoVFlQRV9TSVpFX1VOSVQgKHR5cGUpLCAxKTsKICBpZiAoc2l6ZSA9 PSAxIHx8IHNpemUgPT0gMiB8fCBzaXplID09IDQgfHwgc2l6ZSA9PSA4IHx8 IHNpemUgPT0gMTYpCiAgICByZXR1cm4gc2l6ZTsKCiBpbmNvbXBhdGlibGU6 CiAgZXJyb3IgKCJpbmNvbXBhdGlibGUgdHlwZSBmb3IgYXJndW1lbnQgJWQg b2YgJXFFIiwgMSwgZnVuY3Rpb24pOwogIHJldHVybiAwOwp9CgovKiBBIGhl bHBlciBmdW5jdGlvbiBmb3IgcmVzb2x2ZV9vdmVybG9hZGVkX2J1aWx0aW4u ICBBZGRzIGNhc3RzIHRvCiAgIFBBUkFNUyB0byBtYWtlIGFyZ3VtZW50cyBt YXRjaCB1cCB3aXRoIHRob3NlIG9mIEZVTkNUSU9OLiAgRHJvcHMKICAgdGhl IHZhcmlhZGljIGFyZ3VtZW50cyBhdCB0aGUgZW5kLiAgUmV0dXJucyBmYWxz ZSBpZiBzb21lIGVycm9yCiAgIHdhcyBlbmNvdW50ZXJlZDsgdHJ1ZSBvbiBz dWNjZXNzLiAgKi8KCnN0YXRpYyBib29sCnN5bmNfcmVzb2x2ZV9wYXJhbXMg KHRyZWUgb3JpZ19mdW5jdGlvbiwgdHJlZSBmdW5jdGlvbiwgdHJlZSBwYXJh bXMpCnsKICB0cmVlIGFyZ190eXBlcyA9IFRZUEVfQVJHX1RZUEVTIChUUkVF X1RZUEUgKGZ1bmN0aW9uKSk7CiAgdHJlZSBwdHlwZTsKICBpbnQgbnVtYmVy OwoKICAvKiBXZSd2ZSBkZWNsYXJlZCB0aGUgaW1wbGVtZW50YXRpb24gZnVu Y3Rpb25zIHRvIHVzZSAidm9sYXRpbGUgdm9pZCAqIgogICAgIGFzIHRoZSBw b2ludGVyIHBhcmFtZXRlciwgc28gd2Ugc2hvdWxkbid0IGdldCBhbnkgY29t cGxhaW50cyBmcm9tIHRoZQogICAgIGNhbGwgdG8gY2hlY2tfZnVuY3Rpb25f YXJndW1lbnRzIHdoYXQgZXZlciB0eXBlIHRoZSB1c2VyIHVzZWQuICAqLwog IGFyZ190eXBlcyA9IFRSRUVfQ0hBSU4gKGFyZ190eXBlcyk7CiAgcHR5cGUg PSBUUkVFX1RZUEUgKFRSRUVfVFlQRSAoVFJFRV9WQUxVRSAocGFyYW1zKSkp OwogIG51bWJlciA9IDI7CgogIC8qIEZvciB0aGUgcmVzdCBvZiB0aGUgdmFs dWVzLCB3ZSBuZWVkIHRvIGNhc3QgdGhlc2UgdG8gRlRZUEUsIHNvIHRoYXQg d2UKICAgICBkb24ndCBnZXQgd2FybmluZ3MgZm9yIHBhc3NpbmcgcG9pbnRl ciB0eXBlcywgZXRjLiAgKi8KICB3aGlsZSAoYXJnX3R5cGVzICE9IHZvaWRf bGlzdF9ub2RlKQogICAgewogICAgICB0cmVlIHZhbDsKCiAgICAgIHBhcmFt cyA9IFRSRUVfQ0hBSU4gKHBhcmFtcyk7CiAgICAgIGlmIChwYXJhbXMgPT0g TlVMTCkKCXsKCSAgZXJyb3IgKCJ0b28gZmV3IGFyZ3VtZW50cyB0byBmdW5j dGlvbiAlcUUiLCBvcmlnX2Z1bmN0aW9uKTsKCSAgcmV0dXJuIGZhbHNlOwoJ fQoKICAgICAgLyogPz8/IElkZWFsbHkgZm9yIHRoZSBmaXJzdCBjb252ZXJz aW9uIHdlJ2QgdXNlIGNvbnZlcnRfZm9yX2Fzc2lnbm1lbnQKCSBzbyB0aGF0 IHdlIGdldCB3YXJuaW5ncyBmb3IgYW55dGhpbmcgdGhhdCBkb2Vzbid0IG1h dGNoIHRoZSBwb2ludGVyCgkgdHlwZS4gIFRoaXMgaXNuJ3QgcG9ydGFibGUg YWNyb3NzIHRoZSBDIGFuZCBDKysgZnJvbnQgZW5kcyBhdG0uICAqLwogICAg ICB2YWwgPSBUUkVFX1ZBTFVFIChwYXJhbXMpOwogICAgICB2YWwgPSBjb252 ZXJ0IChwdHlwZSwgdmFsKTsKICAgICAgdmFsID0gY29udmVydCAoVFJFRV9W QUxVRSAoYXJnX3R5cGVzKSwgdmFsKTsKICAgICAgVFJFRV9WQUxVRSAocGFy YW1zKSA9IHZhbDsKCiAgICAgIGFyZ190eXBlcyA9IFRSRUVfQ0hBSU4gKGFy Z190eXBlcyk7CiAgICAgIG51bWJlcisrOwogICAgfQoKICAvKiBUaGUgZGVm aW5pdGlvbiBvZiB0aGVzZSBwcmltaXRpdmVzIGlzIHZhcmlhZGljLCB3aXRo IHRoZSByZW1haW5pbmcKICAgICBiZWluZyAiYW4gb3B0aW9uYWwgbGlzdCBv ZiB2YXJpYWJsZXMgcHJvdGVjdGVkIGJ5IHRoZSBtZW1vcnkgYmFycmllciIu CiAgICAgTm8gY2x1ZSB3aGF0IHRoYXQncyBzdXBwb3NlZCB0byBtZWFuLCBw cmVjaXNlbHksIGJ1dCB3ZSBjb25zaWRlciBhbGwKICAgICBjYWxsLWNsb2Ji ZXJlZCB2YXJpYWJsZXMgdG8gYmUgcHJvdGVjdGVkIHNvIHdlJ3JlIHNhZmUu ICAqLwogIFRSRUVfQ0hBSU4gKHBhcmFtcykgPSBOVUxMOwoKICByZXR1cm4g dHJ1ZTsKfQoKLyogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIHJlc29sdmVfb3Zl cmxvYWRlZF9idWlsdGluLiAgQWRkcyBhIGNhc3QgdG8KICAgUkVTVUxUIHRv IG1ha2UgaXQgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGZpcnN0IHBvaW50ZXIg YXJndW1lbnQgaW4KICAgUEFSQU1TLiAgKi8KCnN0YXRpYyB0cmVlCnN5bmNf cmVzb2x2ZV9yZXR1cm4gKHRyZWUgcGFyYW1zLCB0cmVlIHJlc3VsdCkKewog IHRyZWUgcHR5cGUgPSBUUkVFX1RZUEUgKFRSRUVfVFlQRSAoVFJFRV9WQUxV RSAocGFyYW1zKSkpOwogIHB0eXBlID0gVFlQRV9NQUlOX1ZBUklBTlQgKHB0 eXBlKTsKICByZXR1cm4gY29udmVydCAocHR5cGUsIHJlc3VsdCk7Cn0KCi8q IFNvbWUgYnVpbHRpbiBmdW5jdGlvbnMgYXJlIHBsYWNlaG9sZGVycyBmb3Ig b3RoZXIgZXhwcmVzc2lvbnMuICBUaGlzCiAgIGZ1bmN0aW9uIHNob3VsZCBi ZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcGFyc2luZyB0aGUgY2FsbCBl eHByZXNzaW9uCiAgIGJlZm9yZSBzdXJyb3VuZGluZyBjb2RlIGhhcyBjb21t aXR0ZWQgdG8gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uCgogICBGVU5D VElPTiBpcyB0aGUgREVDTCB0aGF0IGhhcyBiZWVuIGludm9rZWQ7IGl0IGlz IGtub3duIHRvIGJlIGEgYnVpbHRpbi4KICAgUEFSQU1TIGlzIHRoZSBhcmd1 bWVudCBsaXN0IGZvciB0aGUgY2FsbC4gIFRoZSByZXR1cm4gdmFsdWUgaXMg bm9uLW51bGwKICAgd2hlbiBleHBhbnNpb24gaXMgY29tcGxldGUsIGFuZCBu dWxsIGlmIG5vcm1hbCBwcm9jZXNzaW5nIHNob3VsZAogICBjb250aW51ZS4g ICovCgp0cmVlCnJlc29sdmVfb3ZlcmxvYWRlZF9idWlsdGluICh0cmVlIGZ1 bmN0aW9uLCB0cmVlIHBhcmFtcykKewogIGVudW0gYnVpbHRfaW5fZnVuY3Rp b24gb3JpZ19jb2RlID0gREVDTF9GVU5DVElPTl9DT0RFIChmdW5jdGlvbik7 CiAgc3dpdGNoIChERUNMX0JVSUxUX0lOX0NMQVNTIChmdW5jdGlvbikpCiAg ICB7CiAgICBjYXNlIEJVSUxUX0lOX05PUk1BTDoKICAgICAgYnJlYWs7CiAg ICBjYXNlIEJVSUxUX0lOX01EOgogICAgICBpZiAodGFyZ2V0bS5yZXNvbHZl X292ZXJsb2FkZWRfYnVpbHRpbikKCXJldHVybiB0YXJnZXRtLnJlc29sdmVf b3ZlcmxvYWRlZF9idWlsdGluIChmdW5jdGlvbiwgcGFyYW1zKTsKICAgICAg ZWxzZQoJcmV0dXJuIE5VTExfVFJFRTsKICAgIGRlZmF1bHQ6CiAgICAgIHJl dHVybiBOVUxMX1RSRUU7CiAgICB9CgogIC8qIEhhbmRsZSBCVUlMVF9JTl9O T1JNQUwgaGVyZS4gICovCiAgc3dpdGNoIChvcmlnX2NvZGUpCiAgICB7CiAg ICBjYXNlIEJVSUxUX0lOX0ZFVENIX0FORF9BRERfTjoKICAgIGNhc2UgQlVJ TFRfSU5fRkVUQ0hfQU5EX1NVQl9OOgogICAgY2FzZSBCVUlMVF9JTl9GRVRD SF9BTkRfT1JfTjoKICAgIGNhc2UgQlVJTFRfSU5fRkVUQ0hfQU5EX0FORF9O OgogICAgY2FzZSBCVUlMVF9JTl9GRVRDSF9BTkRfWE9SX046CiAgICBjYXNl IEJVSUxUX0lOX0ZFVENIX0FORF9OQU5EX046CiAgICBjYXNlIEJVSUxUX0lO X0FERF9BTkRfRkVUQ0hfTjoKICAgIGNhc2UgQlVJTFRfSU5fU1VCX0FORF9G RVRDSF9OOgogICAgY2FzZSBCVUlMVF9JTl9PUl9BTkRfRkVUQ0hfTjoKICAg IGNhc2UgQlVJTFRfSU5fQU5EX0FORF9GRVRDSF9OOgogICAgY2FzZSBCVUlM VF9JTl9YT1JfQU5EX0ZFVENIX046CiAgICBjYXNlIEJVSUxUX0lOX05BTkRf QU5EX0ZFVENIX046CiAgICBjYXNlIEJVSUxUX0lOX0JPT0xfQ09NUEFSRV9B TkRfU1dBUF9OOgogICAgY2FzZSBCVUlMVF9JTl9WQUxfQ09NUEFSRV9BTkRf U1dBUF9OOgogICAgY2FzZSBCVUlMVF9JTl9MT0NLX1RFU1RfQU5EX1NFVF9O OgogICAgY2FzZSBCVUlMVF9JTl9MT0NLX1JFTEVBU0VfTjoKICAgICAgewoJ aW50IG4gPSBzeW5jX3Jlc29sdmVfc2l6ZSAoZnVuY3Rpb24sIHBhcmFtcyk7 Cgl0cmVlIG5ld19mdW5jdGlvbiwgcmVzdWx0OwoKCWlmIChuID09IDApCgkg IHJldHVybiBlcnJvcl9tYXJrX25vZGU7CgoJbmV3X2Z1bmN0aW9uID0gYnVp bHRfaW5fZGVjbHNbb3JpZ19jb2RlICsgZXhhY3RfbG9nMiAobikgKyAxXTsK CWlmICghc3luY19yZXNvbHZlX3BhcmFtcyAoZnVuY3Rpb24sIG5ld19mdW5j dGlvbiwgcGFyYW1zKSkKCSAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsKCgly ZXN1bHQgPSBidWlsZF9mdW5jdGlvbl9jYWxsIChuZXdfZnVuY3Rpb24sIHBh cmFtcyk7CglpZiAob3JpZ19jb2RlICE9IEJVSUxUX0lOX0JPT0xfQ09NUEFS RV9BTkRfU1dBUF9OCgkgICAgJiYgb3JpZ19jb2RlICE9IEJVSUxUX0lOX0xP Q0tfUkVMRUFTRV9OKQoJICByZXN1bHQgPSBzeW5jX3Jlc29sdmVfcmV0dXJu IChwYXJhbXMsIHJlc3VsdCk7CgoJcmV0dXJuIHJlc3VsdDsKICAgICAgfQoK ICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9Cn0K Ci8qIElnbm9yaW5nIHRoZWlyIHNpZ24sIHJldHVybiB0cnVlIGlmIHR3byBz Y2FsYXIgdHlwZXMgYXJlIHRoZSBzYW1lLiAgKi8KYm9vbApzYW1lX3NjYWxh cl90eXBlX2lnbm9yaW5nX3NpZ25lZG5lc3MgKHRyZWUgdDEsIHRyZWUgdDIp CnsKICBlbnVtIHRyZWVfY29kZSBjMSA9IFRSRUVfQ09ERSAodDEpLCBjMiA9 IFRSRUVfQ09ERSAodDIpOwoKICBnY2NfYXNzZXJ0ICgoYzEgPT0gSU5URUdF Ul9UWVBFIHx8IGMxID09IFJFQUxfVFlQRSB8fCBjMSA9PSBGSVhFRF9QT0lO VF9UWVBFKQoJICAgICAgJiYgKGMyID09IElOVEVHRVJfVFlQRSB8fCBjMiA9 PSBSRUFMX1RZUEUKCQkgIHx8IGMyID09IEZJWEVEX1BPSU5UX1RZUEUpKTsK CiAgLyogRXF1YWxpdHkgd29ya3MgaGVyZSBiZWNhdXNlIGNfY29tbW9uX3Np Z25lZF90eXBlIHVzZXMKICAgICBUWVBFX01BSU5fVkFSSUFOVC4gICovCiAg cmV0dXJuIGNfY29tbW9uX3NpZ25lZF90eXBlICh0MSkKICAgID09IGNfY29t bW9uX3NpZ25lZF90eXBlICh0Mik7Cn0KCi8qIENoZWNrIGZvciBtaXNzaW5n IGZvcm1hdCBhdHRyaWJ1dGVzIG9uIGZ1bmN0aW9uIHBvaW50ZXJzLiAgTFRZ UEUgaXMKICAgdGhlIG5ldyB0eXBlIG9yIGxlZnQtaGFuZCBzaWRlIHR5cGUu ICBSVFlQRSBpcyB0aGUgb2xkIHR5cGUgb3IKICAgcmlnaHQtaGFuZCBzaWRl IHR5cGUuICBSZXR1cm5zIFRSVUUgaWYgTFRZUEUgaXMgbWlzc2luZyB0aGUg ZGVzaXJlZAogICBhdHRyaWJ1dGUuICAqLwoKYm9vbApjaGVja19taXNzaW5n X2Zvcm1hdF9hdHRyaWJ1dGUgKHRyZWUgbHR5cGUsIHRyZWUgcnR5cGUpCnsK ICB0cmVlIGNvbnN0IHR0ciA9IFRSRUVfVFlQRSAocnR5cGUpLCB0dGwgPSBU UkVFX1RZUEUgKGx0eXBlKTsKICB0cmVlIHJhOwoKICBmb3IgKHJhID0gVFlQ RV9BVFRSSUJVVEVTICh0dHIpOyByYTsgcmEgPSBUUkVFX0NIQUlOIChyYSkp CiAgICBpZiAoaXNfYXR0cmlidXRlX3AgKCJmb3JtYXQiLCBUUkVFX1BVUlBP U0UgKHJhKSkpCiAgICAgIGJyZWFrOwogIGlmIChyYSkKICAgIHsKICAgICAg dHJlZSBsYTsKICAgICAgZm9yIChsYSA9IFRZUEVfQVRUUklCVVRFUyAodHRs KTsgbGE7IGxhID0gVFJFRV9DSEFJTiAobGEpKQoJaWYgKGlzX2F0dHJpYnV0 ZV9wICgiZm9ybWF0IiwgVFJFRV9QVVJQT1NFIChsYSkpKQoJICBicmVhazsK ICAgICAgcmV0dXJuICFsYTsKICAgIH0KICBlbHNlCiAgICByZXR1cm4gZmFs c2U7Cn0KCi8qIFN1YnNjcmlwdGluZyB3aXRoIHR5cGUgY2hhciBpcyBsaWtl bHkgdG8gbG9zZSBvbiBhIG1hY2hpbmUgd2hlcmUKICAgY2hhcnMgYXJlIHNp Z25lZC4gIFNvIHdhcm4gb24gYW55IG1hY2hpbmUsIGJ1dCBvcHRpb25hbGx5 LiAgRG9uJ3QKICAgd2FybiBmb3IgdW5zaWduZWQgY2hhciBzaW5jZSB0aGF0 IHR5cGUgaXMgc2FmZS4gIERvbid0IHdhcm4gZm9yCiAgIHNpZ25lZCBjaGFy IGJlY2F1c2UgYW55b25lIHdobyB1c2VzIHRoYXQgbXVzdCBoYXZlIGRvbmUg c28KICAgZGVsaWJlcmF0ZWx5LiBGdXJ0aGVybW9yZSwgd2UgcmVkdWNlIHRo ZSBmYWxzZSBwb3NpdGl2ZSBsb2FkIGJ5CiAgIHdhcm5pbmcgb25seSBmb3Ig bm9uLWNvbnN0YW50IHZhbHVlIG9mIHR5cGUgY2hhci4gICovCgp2b2lkCndh cm5fYXJyYXlfc3Vic2NyaXB0X3dpdGhfdHlwZV9jaGFyICh0cmVlIGluZGV4 KQp7CiAgaWYgKFRZUEVfTUFJTl9WQVJJQU5UIChUUkVFX1RZUEUgKGluZGV4 KSkgPT0gY2hhcl90eXBlX25vZGUKICAgICAgJiYgVFJFRV9DT0RFIChpbmRl eCkgIT0gSU5URUdFUl9DU1QpCiAgICB3YXJuaW5nIChPUFRfV2NoYXJfc3Vi c2NyaXB0cywgImFycmF5IHN1YnNjcmlwdCBoYXMgdHlwZSAlPGNoYXIlPiIp Owp9CgovKiBJbXBsZW1lbnQgLVdwYXJlbnRoZXNlcyBmb3IgdGhlIHVuZXhw ZWN0ZWQgQyBwcmVjZWRlbmNlIHJ1bGVzLCB0bwogICBjb3ZlciBjYXNlcyBs aWtlIHggKyB5IDw8IHogd2hpY2ggcmVhZGVycyBhcmUgbGlrZWx5IHRvCiAg IG1pc2ludGVycHJldC4gIFdlIGhhdmUgc2VlbiBhbiBleHByZXNzaW9uIGlu IHdoaWNoIENPREUgaXMgYSBiaW5hcnkKICAgb3BlcmF0b3IgdXNlZCB0byBj b21iaW5lIGV4cHJlc3Npb25zIGhlYWRlZCBieSBDT0RFX0xFRlQgYW5kCiAg IENPREVfUklHSFQuICBDT0RFX0xFRlQgYW5kIENPREVfUklHSFQgbWF5IGJl IEVSUk9SX01BUkssIHdoaWNoCiAgIG1lYW5zIHRoYXQgdGhhdCBzaWRlIG9m IHRoZSBleHByZXNzaW9uIHdhcyBub3QgZm9ybWVkIHVzaW5nIGEKICAgYmlu YXJ5IG9wZXJhdG9yLCBvciBpdCB3YXMgZW5jbG9zZWQgaW4gcGFyZW50aGVz ZXMuICAqLwoKdm9pZAp3YXJuX2Fib3V0X3BhcmVudGhlc2VzIChlbnVtIHRy ZWVfY29kZSBjb2RlLCBlbnVtIHRyZWVfY29kZSBjb2RlX2xlZnQsCgkJCWVu dW0gdHJlZV9jb2RlIGNvZGVfcmlnaHQpCnsKICBpZiAoIXdhcm5fcGFyZW50 aGVzZXMpCiAgICByZXR1cm47CgogIGlmIChjb2RlID09IExTSElGVF9FWFBS IHx8IGNvZGUgPT0gUlNISUZUX0VYUFIpCiAgICB7CiAgICAgIGlmIChjb2Rl X2xlZnQgPT0gUExVU19FWFBSIHx8IGNvZGVfbGVmdCA9PSBNSU5VU19FWFBS CgkgIHx8IGNvZGVfcmlnaHQgPT0gUExVU19FWFBSIHx8IGNvZGVfcmlnaHQg PT0gTUlOVVNfRVhQUikKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJ ICJzdWdnZXN0IHBhcmVudGhlc2VzIGFyb3VuZCArIG9yIC0gaW5zaWRlIHNo aWZ0Iik7CiAgICB9CgogIGlmIChjb2RlID09IFRSVVRIX09SSUZfRVhQUikK ICAgIHsKICAgICAgaWYgKGNvZGVfbGVmdCA9PSBUUlVUSF9BTkRJRl9FWFBS CgkgIHx8IGNvZGVfcmlnaHQgPT0gVFJVVEhfQU5ESUZfRVhQUikKCXdhcm5p bmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhlc2Vz IGFyb3VuZCAmJiB3aXRoaW4gfHwiKTsKICAgIH0KCiAgaWYgKGNvZGUgPT0g QklUX0lPUl9FWFBSKQogICAgewogICAgICBpZiAoY29kZV9sZWZ0ID09IEJJ VF9BTkRfRVhQUiB8fCBjb2RlX2xlZnQgPT0gQklUX1hPUl9FWFBSCgkgIHx8 IGNvZGVfbGVmdCA9PSBQTFVTX0VYUFIgfHwgY29kZV9sZWZ0ID09IE1JTlVT X0VYUFIKCSAgfHwgY29kZV9yaWdodCA9PSBCSVRfQU5EX0VYUFIgfHwgY29k ZV9yaWdodCA9PSBCSVRfWE9SX0VYUFIKCSAgfHwgY29kZV9yaWdodCA9PSBQ TFVTX0VYUFIgfHwgY29kZV9yaWdodCA9PSBNSU5VU19FWFBSKQoJd2Fybmlu ZyAoT1BUX1dwYXJlbnRoZXNlcywKCQkgInN1Z2dlc3QgcGFyZW50aGVzZXMg YXJvdW5kIGFyaXRobWV0aWMgaW4gb3BlcmFuZCBvZiB8Iik7CiAgICAgIC8q IENoZWNrIGNhc2VzIGxpa2UgeHx5PT16ICovCiAgICAgIGlmIChUUkVFX0NP REVfQ0xBU1MgKGNvZGVfbGVmdCkgPT0gdGNjX2NvbXBhcmlzb24KCSAgfHwg VFJFRV9DT0RFX0NMQVNTIChjb2RlX3JpZ2h0KSA9PSB0Y2NfY29tcGFyaXNv bikKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBh cmVudGhlc2VzIGFyb3VuZCBjb21wYXJpc29uIGluIG9wZXJhbmQgb2YgfCIp OwogICAgfQoKICBpZiAoY29kZSA9PSBCSVRfWE9SX0VYUFIpCiAgICB7CiAg ICAgIGlmIChjb2RlX2xlZnQgPT0gQklUX0FORF9FWFBSCgkgIHx8IGNvZGVf bGVmdCA9PSBQTFVTX0VYUFIgfHwgY29kZV9sZWZ0ID09IE1JTlVTX0VYUFIK CSAgfHwgY29kZV9yaWdodCA9PSBCSVRfQU5EX0VYUFIKCSAgfHwgY29kZV9y aWdodCA9PSBQTFVTX0VYUFIgfHwgY29kZV9yaWdodCA9PSBNSU5VU19FWFBS KQoJd2FybmluZyAoT1BUX1dwYXJlbnRoZXNlcywKCQkgInN1Z2dlc3QgcGFy ZW50aGVzZXMgYXJvdW5kIGFyaXRobWV0aWMgaW4gb3BlcmFuZCBvZiBeIik7 CiAgICAgIC8qIENoZWNrIGNhc2VzIGxpa2UgeF55PT16ICovCiAgICAgIGlm IChUUkVFX0NPREVfQ0xBU1MgKGNvZGVfbGVmdCkgPT0gdGNjX2NvbXBhcmlz b24KCSAgfHwgVFJFRV9DT0RFX0NMQVNTIChjb2RlX3JpZ2h0KSA9PSB0Y2Nf Y29tcGFyaXNvbikKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJz dWdnZXN0IHBhcmVudGhlc2VzIGFyb3VuZCBjb21wYXJpc29uIGluIG9wZXJh bmQgb2YgXiIpOwogICAgfQoKICBpZiAoY29kZSA9PSBCSVRfQU5EX0VYUFIp CiAgICB7CiAgICAgIGlmIChjb2RlX2xlZnQgPT0gUExVU19FWFBSIHx8IGNv ZGVfbGVmdCA9PSBNSU5VU19FWFBSCgkgIHx8IGNvZGVfcmlnaHQgPT0gUExV U19FWFBSIHx8IGNvZGVfcmlnaHQgPT0gTUlOVVNfRVhQUikKCXdhcm5pbmcg KE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhlc2VzIGFy b3VuZCArIG9yIC0gaW4gb3BlcmFuZCBvZiAmIik7CiAgICAgIC8qIENoZWNr IGNhc2VzIGxpa2UgeCZ5PT16ICovCiAgICAgIGlmIChUUkVFX0NPREVfQ0xB U1MgKGNvZGVfbGVmdCkgPT0gdGNjX2NvbXBhcmlzb24KCSAgfHwgVFJFRV9D T0RFX0NMQVNTIChjb2RlX3JpZ2h0KSA9PSB0Y2NfY29tcGFyaXNvbikKCXdh cm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhl c2VzIGFyb3VuZCBjb21wYXJpc29uIGluIG9wZXJhbmQgb2YgJiIpOwogICAg fQoKICBpZiAoY29kZSA9PSBFUV9FWFBSIHx8IGNvZGUgPT0gTkVfRVhQUikK ICAgIHsKICAgICAgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29kZV9sZWZ0KSA9 PSB0Y2NfY29tcGFyaXNvbgogICAgICAgICAgfHwgVFJFRV9DT0RFX0NMQVNT IChjb2RlX3JpZ2h0KSA9PSB0Y2NfY29tcGFyaXNvbikKCXdhcm5pbmcgKE9Q VF9XcGFyZW50aGVzZXMsCgkJICJzdWdnZXN0IHBhcmVudGhlc2VzIGFyb3Vu ZCBjb21wYXJpc29uIGluIG9wZXJhbmQgb2YgJXMiLAogICAgICAgICAgICAg ICAgIGNvZGUgPT0gRVFfRVhQUiA/ICI9PSIgOiAiIT0iKTsKICAgIH0KICBl bHNlIGlmIChUUkVFX0NPREVfQ0xBU1MgKGNvZGUpID09IHRjY19jb21wYXJp c29uKQogICAgewogICAgICBpZiAoKFRSRUVfQ09ERV9DTEFTUyAoY29kZV9s ZWZ0KSA9PSB0Y2NfY29tcGFyaXNvbgoJICAgJiYgY29kZV9sZWZ0ICE9IE5F X0VYUFIgJiYgY29kZV9sZWZ0ICE9IEVRX0VYUFIpCgkgIHx8IChUUkVFX0NP REVfQ0xBU1MgKGNvZGVfcmlnaHQpID09IHRjY19jb21wYXJpc29uCgkgICAg ICAmJiBjb2RlX3JpZ2h0ICE9IE5FX0VYUFIgJiYgY29kZV9yaWdodCAhPSBF UV9FWFBSKSkKCXdhcm5pbmcgKE9QVF9XcGFyZW50aGVzZXMsICJjb21wYXJp c29ucyBsaWtlIFg8PVk8PVogZG8gbm90ICIKCQkgImhhdmUgdGhlaXIgbWF0 aGVtYXRpY2FsIG1lYW5pbmciKTsKICAgIH0KfQoKLyogSWYgTEFCRUwgKGEg TEFCRUxfREVDTCkgaGFzIG5vdCBiZWVuIHVzZWQsIGlzc3VlIGEgd2Fybmlu Zy4gICovCgp2b2lkCndhcm5fZm9yX3VudXNlZF9sYWJlbCAodHJlZSBsYWJl bCkKewogIGlmICghVFJFRV9VU0VEIChsYWJlbCkpCiAgICB7CiAgICAgIGlm IChERUNMX0lOSVRJQUwgKGxhYmVsKSkKCXdhcm5pbmcgKE9QVF9XdW51c2Vk X2xhYmVsLCAibGFiZWwgJXErRCBkZWZpbmVkIGJ1dCBub3QgdXNlZCIsIGxh YmVsKTsKICAgICAgZWxzZQogICAgICAgIHdhcm5pbmcgKE9QVF9XdW51c2Vk X2xhYmVsLCAibGFiZWwgJXErRCBkZWNsYXJlZCBidXQgbm90IGRlZmluZWQi LCBsYWJlbCk7CiAgICB9Cn0KCiNpZm5kZWYgVEFSR0VUX0hBU19UQVJHRVRD TQpzdHJ1Y3QgZ2NjX3RhcmdldGNtIHRhcmdldGNtID0gVEFSR0VUQ01fSU5J VElBTElaRVI7CiNlbmRpZgoKLyogV2FybiBmb3IgZGl2aXNpb24gYnkgemVy byBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIERJVklTT1IuICAqLwoKdm9p ZAp3YXJuX2Zvcl9kaXZfYnlfemVybyAodHJlZSBkaXZpc29yKQp7CiAgLyog SWYgRElWSVNPUiBpcyB6ZXJvLCBhbmQgaGFzIGludGVncmFsIG9yIGZpeGVk LXBvaW50IHR5cGUsIGlzc3VlIGEgd2FybmluZwogICAgIGFib3V0IGRpdmlz aW9uIGJ5IHplcm8uICBEbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIERJVklT T1IgaGFzIGEKICAgICBmbG9hdGluZy1wb2ludCB0eXBlLCBzaW5jZSB3ZSBj b25zaWRlciAwLjAvMC4wIGEgdmFsaWQgd2F5IG9mCiAgICAgZ2VuZXJhdGlu ZyBhIE5hTi4gICovCiAgaWYgKHNraXBfZXZhbHVhdGlvbiA9PSAwCiAgICAg ICYmIChpbnRlZ2VyX3plcm9wIChkaXZpc29yKSB8fCBmaXhlZF96ZXJvcCAo ZGl2aXNvcikpKQogICAgd2FybmluZyAoT1BUX1dkaXZfYnlfemVybywgImRp dmlzaW9uIGJ5IHplcm8iKTsKfQoKI2luY2x1ZGUgImd0LWMtY29tbW9uLmgi Cg== ------=_Part_22193_3060233.1195871607556--